java实现文件上传下载

完成上传需要满足3个必要的条件

提供form表单,method必须是post,因为get请求的传输数据一般为2kb,不同浏览器不一样。
form表单属性enctype的必须是multipart/form-data
提供input type=”file”类的上传输入域

大致实现原理:当enctype的值是multipart/form-data时,浏览器会把每个表单项进行分割,分割成不同的部件,以boundary的值为分割标识,这个标识的字符串是随机生成的,最后一个表单项的分割标识字符串末尾会多两个”- -“,代表结束。服务端用request.getHeader(“content-type”)获取分割字符串,然后进行解析。

代码实现

一、开发环境搭建

准备两个第三方jar包
commons-io包
commons-upload包

代码实现

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 判断表单的enctype值是不是"multipart/form-data"
boolean isMultipartContent = ServletFileUpload
.isMultipartContent(request);
if (!isMultipartContent) {
throw new RuntimeException(“your form is not multipart/form-data”);
}
// 创建一个DiskFileItemfactory工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
// 创建一个ServletFileUpload核心对象
ServletFileUpload sfu = new ServletFileUpload(factory);
// 解析request对象,并得到一个表单项的集合
try {
List fileItems = sfu.parseRequest(request);
// 遍历表单项数据
for (FileItem fileitem : fileItems) {
if (fileitem.isFormField()) {
// 普通表单项
String fieldName = fileitem.getFieldName();
String fieldValue = fileitem.getString();
System.out.println(fieldName + “=====” + fieldValue);
} else {
//上传表单项
//得到文件输入流
InputStream is = fileitem.getInputStream();
//创建文件存储目录
String directoryRealPath = this.getServletContext().getRealPath(“WEB-INF/upload”);
//创建文件路径
File storeDirectory = new File(directoryRealPath + File.separator + fileitem.getName());
//使用apache commons-io包,将输入流转成文件
FileUtils.copyInputStreamToFile(is, storeDirectory);
}
}

    } catch (Exception e) {
        e.printStackTrace();
    }
}

下载的必须条件

两个头一个流

content-type

Content-Type是返回消息中非常重要的内容,表示文档内容属于什么MIME类型。
浏览器会根据Content-Type来决定如何显示返回的消息体内容。
默认值是text/html
可以使用request.getServletContext().getMimeType(“文件名”)获取MIME类型。
Content-Disposition

Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。
默认值是inline,表示在浏览器窗口中打开。
服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器 中显示。
如果需要提示用户保存,利用Content-Disposition进行一下处理,关键在于一定要加上attachment。
例如:Content-Disposition:attachment;filename=xxx,浏览器就会激活下载框对话框, attachment 表示附件, filname 后面跟随的是显示在下载框中的文件名称。

下载就是向客户端响应字节数据! 将一个文件变成字节数组, 使用 response.getOutputStream()
来响应给浏览器。

实现

// 下载
public class DownloadServlet extends HttpServlet{
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException,IOException{
        //根据文件名获取 MIME 类型
        String contentType = this.getServletContext().getMimeType("测试.xls");

        //设置content-Type头
        response.setHeader("Content-Type",contentType);

        //解决下载框为中文名称出现乱码问题
        String fileName;

        //获取用户浏览器
        String agent=request.getHeader("user-agent")

        // 火狐浏览器
        if (agent.contains("Firefox")) { 
            filename = "=?UTF-8?B?"
                    + new BASE64Encoder().encode(filename.getBytes("utf-8"))
                    + "?=";
            filename = filename.replaceAll("\r\n", "");
        // IE及其他浏览器
        } else { 
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+"," ");
        }
        //设置Content-Disposition头
        resp.setHeader("Content-Disposition","attachment; filename=" + filename + "");

        // 输入流
        FileInputStream fis= new FileInputStream("文件路径");
        // 获取输出流
        ServletOutputStream output = response.getOutputStream();
        // 把输入流中的数据写入到输出流中
        byte[] b = new byte[fis.available()];
        fis.read(b);
        //输出
        output .write(b);
        output .flush();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值