文件上传

本文记录Java学习过程中遇到的文件上传~

其实,文件上传和下载的实质都是文件的拷贝:

  • 文件上传:从本地拷贝到服务器磁盘上;
  • 文件下载:从服务器磁盘上拷贝到本地磁盘。

文件上传的步骤:

  • 客户端写一个文件上传表单;
  • 编写服务器端的代码用于接收上传的文件。

示例代码(客户端):

<form action="/WEB32/fileuploadServlet2" method="post" enctype="multipart/form-data">
	<input type="text" name="username"><br>
	<input type="file" name="filename"><br>
	<input type="submit" value="上传文件">
</form>

注意:

  • method必须是post;
  • enctype必须是multipart/form-data。

示例代码(服务端):

//1、创建磁盘文件项工厂
//作用:设置缓存文件的大小  设置临时文件存储的位置
String path_temp = this.getServletContext().getRealPath("temp");
//DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024, new File(path_temp));
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024);
factory.setRepository(new File(path_temp));
//2、创建文件上传的核心类
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件的名称的编码
upload.setHeaderEncoding("UTF-8");

//ServletFileUpload的API
boolean multipartContent = upload.isMultipartContent(request);//判断表单是否是文件上传的表单
if(multipartContent){
	//是文件上传的表单
	//***解析request获得文件项集合
	List<FileItem> parseRequest = upload.parseRequest(request);
	if(parseRequest!=null){
		for(FileItem item : parseRequest){
			//判断是不是一个普通表单项
			boolean formField = item.isFormField();
			if(formField){
				//username=zhangsan
				String fieldName = item.getFieldName();
				String fieldValue = item.getString("UTF-8");//对普通表单项的内容进行编码
				
				System.out.println(fieldName+"----"+fieldValue);
				
				//当表单是enctype="multipart/form-data"时 request.getParameter相关的方法
				//String parameter = request.getParameter("username");
			}else{
				//文件上传项
				//文件的名
				String fileName = item.getName();
				//获得上传文件的内容
				InputStream in = item.getInputStream();
				String path_store = this.getServletContext().getRealPath("upload");
				OutputStream out = new FileOutputStream(path_store+"/"+fileName);
				IOUtils.copy(in, out);
				in.close();
				out.close();
				
				//删除临时文件
				item.delete();
			}
		}

}else{
	//不是文件上传表单
	//使用原始的表单数据的获得方式 request.getParameter();
}

常用的API

DiskFileItemFactory:磁盘文件项工厂(一些相关的配置的设置:缓存的大小和临时目录的位置):

  • factory.setSizeThreshold():设置缓存大小,单位是字节;
  • factory.setRepository(File):设置临时文件的目录。

ServletFileUplaod:文件上传的一个核心类 :

  • ServletFileUpload.isMultipartContent(request):判断是否是一个文件上传的表单;
  • upload.parseRequest(request):解析request获得表单项的集合;
  • upload.setHeaderEncoding("UTF-8"):设置上传的文件名的编码方式。

FileItem:代表每一个表单项:

  • item.isFormField():判断是否是普通表单项;
  • item.getFieldName():获得表单的name属性值;
  • item.getString("UTF-8"):获得表单的value值;
  • item.getName():获得上传文件的名称;
  • item.getInputStream():获得上传文件;
  • item.delete():删除临时文件。

标签: none