文件的上传

文件的上传是通过表单的形式提交的,对表单有以下两个规则

1,表单必须有file输入项:<input type=”file” name = “filename”>
2,表单的提交方式必须是post,enctype属性值必须是multipart/form-data。
如果不设置的话,默认是application/x-www-form-urlencoded。且文件内容不会被提交

enctype属性值设置为multipart/form-data,那么将不能够通过request.getParamter相关方法去获取到值。

步骤

文件上传的基本步骤
1.创建文件上传项工厂对象:DiskFileUploadFactory factory= new DiskFileUploadFactory();
2通过工厂对象得到解析器:ServletFileUpload sf= new ServletFileUpload(factory)
3.解析请求对象,得到上传的表单项:List< Fileltem1ist=sf,parseRequest(request);list集合里面包含普通的表单项和文件上传表单项

FileItem接口

方法一:boolean f= is FormField(),如果值为true,代表是普通的表单项,否则就是文件上传项

方法二:文件上传项的方法:String filename= getName(),表示获取文件的名称。比如由于不同的浏览器提交的不同,所以说获取文件名称时,有的就是文件名称a.txt,有的是c:/user/desktop/atxt

方法三:普通表单项的方法:String name= getFieldName(),返回的就是name属性的值,比如< input type=”text”name返回的就是 username

方法四:write(File file),主要应用于文件上传时,把文件保存到服务器硬盘

方法五:String value= getstring();主要用于获取字符串,其实就是获取用户输入的值。

方法六:String type= getContentType();获取的是文件的MME类型,比如“image/jpeg”。就是获取文件后缀

方法七:boolean f= isInMemory()判断上传的文件时存在内存中,还是临时文件中。防止内存溢出

方法八:void delete();文件上传完毕后,删除临时文件。

方法九: Inputstream in= getInputstream();获取上传文的字节输入流

方法十:long getsize();获取上传文件的大小

DeskFileItemFactory类

1.setSize Threshold(int sizeThreshold)和 getsize Threshold
其中set方法用来设置上传文件的临界值
比如:setsizethreshold(1024),如果文件上传超出了这个1024,就启用临时文件

2.setRepository(java.io File repository)和getRepository()
当上传的文件大小超出了 setsizethreshold方法设置的大小,就启用临时文件,就是把上传的文件内容暂时保存在临时文件

ServletFileUpload

它的作用来解析 request.对象,把 request对象里面封装的表单数据解析成表单项

方法一:List< FileItem>1ist= parseRequest(request);
方法二:setsizeMax;设置上传文件的总大小。
方法三:setfilesizeMax;投置单个文件的大小

上传案例

提交表单

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>文件上传</title>
	</head>
	<body>
		<form action="UploadServlet" method="post" enctype="multipart/form-data">
			<table width="300px" border="1px">
				<tr>
					<td>上传者</td>
					<td><input type="text" name="user_name"></td>
				</tr>
				<tr>
					<td>上传文件</td>
					<td><input type="file" name = "file_name"></td>
				</tr>
				<tr>
					<td colspan="2"><input type="submit" value="上传"></td>
				</tr>
			</table>
		</form>
	</body>
</html>

UploadServlet

package p01.FileUpload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


/**
 * Servlet implementation class UploadServlet
 */
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UploadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//处理编码
		response.setContentType("text/html;charset=utf-8");
		//创建工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		File f = new File("D:\\ceshi");
		if(!f.exists()) {
			f.mkdirs();
		}
		//设置临时文件
		factory.setRepository(f);
		//设置临时文件大小
		factory.setSizeThreshold(1024*1024);
		//创建解析器对象
		ServletFileUpload fileupload = new ServletFileUpload(factory);
		//设置字符编码
		fileupload.setHeaderEncoding("utf-8");
		//解析请求对象
		try {
			List<FileItem> fileItems = fileupload.parseRequest(request);
			for(FileItem file_item : fileItems) {
				boolean flag = file_item.isFormField();
				//是普通表单项目
				if(flag) {
					//获取普通表单项字段
					String name = file_item.getFieldName();
					if("user_name".equals(name)) {
						//该字段值不为空,打印值。
						if(!file_item.getString().equals("")) {
							String value = file_item.getString("utf-8");
							response.getWriter().print("上传者:" + value + "<br/>");
						}
					}
				}else {//是文件上传表单项
					//文件上的表单字段
					String filename = file_item.getName();
					//判断文件名是否包含路径,是的话就修改到只剩下文件名
					if(filename!=null && !filename.equals("")) {
						response.getWriter().print("上传的文件名是:" + filename + "<br/>");
						filename = filename.substring(filename.lastIndexOf("\\")+1);
						//处理上传了同名文件问题
						filename = UUID.randomUUID().toString()+"_"+filename;
						//在服务器创建同名文件
						String webPath = "/upload";
						//把文件名称和服务端的文件组合在一起
						String filepath = getServletContext().getRealPath(webPath+filename);
						//创建文件
						File file = new File(filepath);
						file.getParentFile().mkdirs();
						file.createNewFile();
						//获取文件输入流
						InputStream in = file_item.getInputStream();
						//输出流
						FileOutputStream out = new FileOutputStream(file);
						//流与流对接
						byte [] buffer = new byte[1024];
						int len = 0;
						while((len = in.read(buffer))>0) {
							out.write(buffer,0,len);
						}
						in.close();
						out.close();
						//删除临时文件
						response.getWriter().print("文件上传成功<br/>");
						response.getWriter().print("保存路径"+filepath);
					}
				
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

文件的下载

文件下载:从服务器端把文件保存到本地
文件下载:一个流两个头
一个流:文件的字节输入流。两个头(响应头)

Content-Type:对应文件的MNE类型(可以理解为文件的扩展名)
Content-Disposition:以下载框的方式保存文件。

步骤

1,创建下载页面:download.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
	</head>
	<body>
		<a href="/Demo12_Download/DownloadServlet?filename=ceshi.txt">文件下载</a>
	</body>
</html>

2,创建一个servlet处理下载请求

package p01.Servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public DownloadServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String filename = request.getParameter("filename");
		//根据文件名称获取文件的mime类型
		String fileType = getServletContext().getMimeType(filename);
		//设置两个头
		response.addHeader("Content-Type", fileType);
		response.addHeader("Content-Disposition", "attachment;filename="+filename);
		//文件下载
		String folder = "/Download/";
		//获取文件字节输入流
		InputStream in = getServletContext().getResourceAsStream(folder+filename);
		//获取文件字节输出流
		OutputStream out = response.getOutputStream();
		//流对接
		byte arr [] = new byte[1024];
		int len = 0;
		while((len = in.read(arr))!=-1) {
			out.write(arr,0,len);
		}
		out.close();
		in.close();
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
说点什么
暂时没有人评论
Loading...