Servlet的文件上传和下载

参考https://blog.csdn.net/weixin_44742328/article/details/111645390

文件的上传介绍
  1. form标签,method=post请求
  2. form标签的encType属性值必须为multipart/form-data值
  3. 在form标签中使用input type=file 添加上传的文件
  4. 编写服务器代码(servlet程序)接收,处理上传的数据

encType=multipart/form-data表示提交的数据以多段(一个表单项为一段)的形式进行拼接,然后以二进制流的形式放送给服务器。
image.png

commons-fileupload.jar常用API
  • commons-fileupload.jar 需要依赖 commons-io.jar 这个包,所以两个包我们都要引入。
  • ServletFileUpload 类,用于解析上传的数据。
    • boolean ServletFileUpload.isMultipartContent(HttpServletRequest request);判断当前上传的数据格式是否是多段的格式。
    • public List parseRequest(HttpServletRequest request)解析上传的数据
  • FileItem 类,表示每一个表单项。
    • boolean FileItem.isFormField()判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。true 表示普通类型的表单项 false 表示上传的文件类型
    • String FileItem.getFieldName()获取表单项的 name 属性值
    • String FileItem.getString()获取当前表单项的值。
    • String FileItem.getName();获取上传的文件名
    • void FileItem.write( file );将上传的文件写到参数file所指向抽硬盘位置 。
文件上传
package com.amo;

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;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @ClassName:UploadServlet
 * @data:2021/5/21 下午4:41
 * @author:amo
 */
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("file coming!");
        //先判断上传的数据是否多短数据(只有是多段数据,才是文件上传的)
        if(ServletFileUpload.isMultipartContent(req)){
            DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
            ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
            try {
                List<FileItem> list = servletFileUpload.parseRequest(req);
                for(FileItem f:list){
                    if(f.isFormField()){
                        System.out.println(f.getFieldName()+f.getString("UTF-8"));
                    }else {
                        System.out.println(f.getFieldName()+f.getName());
                        try {
                            f.write(new File("/Users/amo/Download"+f.getName()));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
        }
    }
}

文件下载
  • 常用方法
    • response.getOutputStream();
    • servletContext.getResourceAsStream();
    • servletContext.getMimeType();
    • response.setContentType();
  • response.setHeader(“Content-Disposition”, “attachment; fileName=1.jpg”);这个响应头告诉浏览器。这是需要下载的。而 attachment 表示附件,也就是下载的一个文件。fileName=后面,表示下载的文件名。
  • 中文名文件下载出错:在响应头中,不能包含有中文字符,只能包含 ASCII 码。
package com.amo;

import org.apache.commons.io.IOUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import java.io.IOException;
import java.io.InputStream;

/**
 * @ClassName:Download
 * @data:2021/5/21 下午5:18
 * @author:amo
 */
public class Download extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //web下有/file/c.jpg资源
        String downloadFileName="c.jpg";
        ServletContext servletContext = getServletContext();
        String mimeType = servletContext.getMimeType("/file/" + downloadFileName);
        System.out.println("下载文件类型"+mimeType);

        resp.setContentType(mimeType);
        resp.setHeader("Content-Disposition","attachment;filename="+downloadFileName);
        InputStream resourceAsStream= servletContext.getResourceAsStream("/file/"+downloadFileName);

        ServletOutputStream outputStream = resp.getOutputStream();
        IOUtils.copy(resourceAsStream,outputStream);
    }
}

解决附件中文名乱码问题
  • Chrome浏览器
//中文名UTF-8编码
String str="attachment;fileName="+URLEncoder.encode("中文.jpg","UTF-8");
//然后把编码后的字符串设置到响应头
response.setHeader("Content-Disposition",str);
  • 火狐浏览器:BASE64编码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值