zoukankan      html  css  js  c++  java
  • Java开发系列-文件上传

    概述

    Java开发中文件上传的方式有很多,常见的有servlet3.0、common-fileUpload、框架。不管哪种方式,对于文件上传的本质是不变的。

    文件上传的准备

    文件上传需要客户端跟服务都有必须的规定,跟普通的post表单提交不太一样。

    客户端的要求

    1. 首先请求的方式必须是Post请求。
    2. 以往我们通过表单提交普通数据用的组件,比如input类型text、checkbox、password等这些我们称之为普通上传组件。对于文件上传使用的组件必须是
      <input type="file" name="">
    3. 对于表单必须添加属性 enctype="multipart/form-data"

    服务端要求

    在Servlet3.0中,接受文件上传组件的数据不再是通过request.getParameter(),而是通过request.getPart

    // 获取上传组件
    Part part = request.getPart("f");
    // 获取文件上传的文件二进制数据
    InputStream inputStream = part.getInputStream();
    

    文件上传技术实现方式

    Servlet3.0文件上传

    在Servlet3.0中,提供了一个注解@MultipartConfig,当Servlet添加该注解后才可在接受到Post请求通过request.getPart()获取到文件组件的Port对象,否则取值为nil。

    具体的文件上代码

    package com.coderhong.web.servlet;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.Part;
    
    import org.apache.commons.io.IOUtils;
    
    @WebServlet("/upload")
    @MultipartConfig
    public class ServletDemo1 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    		request.setCharacterEncoding("utf-8");
    		
    		String username = request.getParameter("username");
    		System.out.println(username);
    		
    		// 获取上传组件
    		Part part = request.getPart("f");
    		System.out.println(part);
    		
    		// 获取文件名
    		String dis = part.getHeader("Content-Disposition");
    		//System.out.println(header); // // form-data; name="f"; filename="Desert.jpg"
    		String prefStr = "filename=";
    		String fileName = dis.substring(dis.indexOf(prefStr)+prefStr.length()+1, dis.length()-1);
    		
    		// 获取项目路径
    		String projPath =  request.getServletContext().getRealPath("/upload/");
    		File file = new File(projPath);
    		if(!file.exists()){
    			file.mkdirs();
    		}
    		
    		// 获取文件上传的文件二进制数据
    		InputStream inputStream = part.getInputStream();
    		// 流拷贝存储文件到目标目录
    		OutputStream os = new FileOutputStream(new File(projPath, fileName));
    		IOUtils.copy(inputStream, os);
    		// 释放流资源
    		os.close();
    		inputStream.close();
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }
    

    common-fileUpload文件上传

    使用common-fileUpload文件上传需要先导入jar包。

    Servlet中实现代码:

    package com.coderhong.servlet;
    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.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.io.FilenameUtils;
    import org.apache.commons.io.IOUtils;
    
    public class UpLoadServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
    		
    		ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
    		
    		try {
    			List<FileItem> list = servletFileUpload.parseRequest(request);
    			
    			for (FileItem fileItem : list) {
    				// 判断普通组件还是文件上传组件
    				if(fileItem.isFormField()){ // 普通上传组件
    					String name = fileItem.getFieldName();
    					String value = fileItem.getString("utf-8");
    					
    					System.out.println("name="+name+" "+"vaue="+value);
    				}else{ // 文件上传组件
    					// 获取name属性
    					String name = fileItem.getFieldName();
    					// 获取文件名称
    					String fieldName = fileItem.getName();
    					// 获取文件内容
    					InputStream inputStream = fileItem.getInputStream();
    					
    					// 设置存储文件存放路径(注意目录必须是存在的)
    					String realPath = this.getServletContext().getRealPath("/products/");
    					
    					// 生成唯一的文件名称
    					String fileName = UUID.randomUUID().toString()+"."+FilenameUtils.getExtension(fieldName);
    					fileItem.write(new File(realPath, fileName));
    					
    					System.out.println("name="+name+" "+"fileName="+fieldName);
    				}
    			}	
    		}
    		catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    
  • 相关阅读:
    Entity Framework 数据并发访问错误原因分析与系统架构优化
    项目中如何使用EF
    Entity Framework版本历史概览
    Entity Framework 6 预热、启动优化
    jQuery EasyUI Datagrid性能优化专题(转)
    jQuery EasyUI Datagrid VirtualScrollView视图简单分析
    用JS判断IE版本的代码
    【转】编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程
    【转】编写高质量代码改善C#程序的157个建议——建议55:利用定制特性减少可序列化的字段
    【转】编写高质量代码改善C#程序的157个建议——建议54:为无用字段标注不可序列化
  • 原文地址:https://www.cnblogs.com/CoderHong/p/9508598.html
Copyright © 2011-2022 走看看