文件上传与下载

1、使用Servlet3.0的新特性实现文件上传

  实现文件上传需要以下两项内容:

  ①添加@MultipartConfig注解

  ②从request对象中获取Part文件对象

  @MultipartConfig注解需要标注在@WebServlet注释之上,@MultipartConfig注解的常用属性有如下:

属性名

类型 是否可选 描述

fileSizeThreshold

int 当数据量大于该值时,内容将被写入文件

location

String 存放临时生成的文件地址

maxFileSize

long 允许上传的文件最大值。默认值为-1,表示没有限制

maxRequestSize

long 针对该multipart/form-data请求的最大数量,默认值为-1,表示没有限制

 

  ③getPart(String name):name参数表示请求的name文件

  ④Collection<Part> geParts():

@WebServlet("/uploadServlet")
@MultipartConfig()
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("你好");
        resp.setContentType("text/html;charset=UTF-8");
        //存储路径
        String savePath = req.getServletContext().getRealPath("/WEB-INF/uploadFile");
        System.out.println(savePath);
        Part part = req.getPart("file1");//获取用户上传的文件
        //servlet 3.0没有提供直接获取文件名的方法,需要从请求头中解析出来
        //如:Content-Disposition: form-data; name="file1"; filename="游戏王.png"
        String header = part.getHeader("Content-Disposition");//获取header
        //解析出文件名
        String fileName = ParseHeader.getFileName(header);
        part.write(savePath+ File.separator+fileName);
        System.out.println(fileName);


    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}
//解析请求头,获取文件名( Content-Disposition: form-data; name="file"; filename="游戏王.png")
    public static String getFileName(String header){
        String[] headerParams = header.split(";");
        //在不同的浏览器下,数组里面的内容稍有区别
        //火狐或者google浏览器下:tempArr1={form-data,name="file",filename="游戏王.png"}
        //IE浏览器下:tempArr1={form-data,name="file",filename="E:\游戏王.png"}
        String[] headerParam = headerParams[2].split("=");
        return headerParam[1].substring(headerParam[1].lastIndexOf("\\")+1).replaceAll("\"","");
    }

 2、使用Commons-FileUpload组件实现文件上传

  ①表单form配置:将enctype属性设置为multipart/form-data

  ②添加文件域:<input type="file" name="file" size="尺寸" />

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String adjunctname;
        String fileDir = "e:/file";//指定上传文件的保存路径
        String message = "文件上传成功";
        String address = "";
        if(ServletFileUpload.isMultipartContent(req)){//判断是否是上传文件
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(20*1024);//设置内存中允许存储的字节数
            factory.setRepository(factory.getRepository());//设置存放临时文件的目录
            ServletFileUpload upload = new ServletFileUpload(factory);//创建新的上传文件句柄
            int size = 2*1024*1024;//指定上传文件的大小上限
            List<FileItem> formLists = null;
            try {
                formLists = upload.parseRequest(req);//获取上传文件的集合
            }catch (FileUploadException e){
                e.printStackTrace();
            }
            for (FileItem fileItem : formLists) {
                if (!fileItem.isFormField()){//忽略不是文件域的表单域
                    String fileName = fileItem.getName();//获取上传文件的名称
                    if(fileItem.getSize()>size){
                        message = "您上传的文件太大,请选择不超过2M的文件";
                        break;
                    }
                    String adjunctsize = Long.toString(fileItem.getSize());//获取上传文件的大小
                    if((fileName==null) || (fileName.equals("")) && (adjunctsize.equals("0"))) {//如果上传文件为空
                        continue;
                    }
                    adjunctname = fileName.substring(fileName.lastIndexOf("\\"),fileName.length());
                    address = fileDir + File.separator + adjunctname;
                    File saveFile = new File(address);
                    try {
                        fileItem.write(saveFile);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            req.setAttribute("result",message);//将提示信息保存在request对象中
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("index.jsp");
        requestDispatcher.forward(req,resp);
 } }

3、Spring文件上传

  使用spring实现文件上传功能,首先需要在DispatcherServlet上下文中添加分段文件解析器。这样,每个请求就会被检查是否包含上传文件,如果有,则应用上下文中已经定义的MultipartResolver就会被调用。

  ①在dispatcher-servlet.xml中配置文件上传解析器

  

<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8" /> //设置编码格式
        <property name="maxUploadSize" value="50000" /> //限制上传文件大小
        <property name="uploadTempDir" value="upload/temp" /> //设置临时文件夹
</bean>

  ②定义上传表单页面

<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
上传文件:<input type="file" name="uploadFileName" value="" /><br/>
<input type="submit" value="上传" />
<input type="reset" value="重置" />
</form>

  ③编写文件上传控制器

  

@Controller
public class FileUploadController {
    @RequestMapping("/upload")
    public String fileUpload(MultipartFile multipartFile, HttpSession session) throws Exception{
        if(multipartFile.getSize()>0){//如果没有选择文件,则跳转到错误页面
            //获取文件名
            String fileName = multipartFile.getName();
            if(fileName.endsWith("jpg")||fileName.endsWith("gif")){//限制上传类型
                String path = "d:/file";
                File localFile = new File(path+File.separator+fileName);
                multipartFile.transferTo(localFile);
            }
        }

    return null;
    }
}

 

  

posted @ 2018-01-05 10:31  小蘇  阅读(262)  评论(0编辑  收藏  举报