JavaWeb学习笔记 | 文件的上传与下载

35 篇文章 0 订阅
34 篇文章 0 订阅

1.进行文件上传时,表单需要做的准备

1.请求方式为POST
<form action="uploadServlet" method="post"></form>
2.使用file的表单域
<input type="file" name = "file" />
3.使用新的编码方式(enctype=“multipart/form-data”)
设定了enctype="multipart/form-data"后,表示表单以二进制传输数据
<form action="uploadServlet" method="post" enctype="multipart/form-data"></form>
Demo:
<form action="uploadServlet" method="post" enctype="multipart/form-data">
        File : <input type="file" name = "file" />
        <input type="submit" value="submit" />
</form>


2.服务端

1.不能再使用request.getParameter()等方式获取信息,获取不到
因为请求的编码方式已经改为multipart/form-data,是以二进制的方式来提交请求信息
2.可以使用输入流的方式来获取

但是不建议这么做,因为比较麻烦

3.使用commons-fileupload组件来完成文件的上传操作

3.使用commons-fileupload组件

1.搭建环境

加入两个jar包

在这里插入图片描述

2.基本思想

(1).commons-fileupload可以解析请求,得到一个FileItem对象组成的List
(2).commons-fileupload把所有请求信息都解析为FileItem对象,无论是一个一般的文本域还是一个文件域。
(3).可以调用FileItem的isFormField()方法来判断是不是表单域,如果不是表单域,则是一个文件域
(4).再来进一步获取信息如下:
if(item.isFormField()){//是表单
    String name = item.getFieldName();
    String value = item.getString();
    ...
}else{//是文件域
    String fieldName = item.getFieldName();
    String fileName = item.getName();
    String contentType = item.getContentType();
    boolean isInMemory = item.isInMemory();
    long sizeInBytes = item.getSize();
    InputStream uploadStream = item.getInputStream();
    ...
    uploadedStream.close();
}
    

3.如何得到List对象

1.简单的方式
FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

List< FileItem > items = upload.parseRequest(request);

2.复杂点的方式
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置内存中最多可以存放的上传文件的大小,若超出则把文件写到一个临时文件夹中,以byte为单位
factory.setSizeThreshold(yourMaxMemorySize);
//设置那个临时文件夹
factory.setRepository(yourTempDirectory);

ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件的总的大小,也可以设置单个文件的大小
upload.setSizeMax(youMaxRequestSize);

List< FileItem > items = upload.parseRequest(request);


3.文件的下载

1.步骤

1.设置contentType响应头(设置响应的类型是什么)

通知浏览器是一个下载的文件

response.setContentType("application/x-msdownload");
2.设置Content-Disposition响应头

通知浏览器不再由浏览器来自行处理(或打开)要下载的文件,而由用户手工来完成。

response.setHeader("Content-Disposition","attachment;filename=aa.ppt");
3.具体的文件

可以调用response.getOutputStream,以IO流的方式发送给客户端。

2.demo

1.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="downloadServlet">DownLoad</a>
</body>
</html>
2.Servlet文件
@WebServlet(name = "DownloadServlet",urlPatterns = "/downloadServlet")
public class DownloadServlet extends HttpServlet {


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应头
        response.setContentType("application/x-msdownload");
        String fileName = "文件下载.pptx";
        response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
        
        //使用输入输出流
        OutputStream outputStream = response.getOutputStream();
        String pptName = "C:\\Users\\cerr\\Desktop\\哈哈哈.pptx";
        InputStream inputStream = new FileInputStream(pptName);
        byte [] bytes = new byte[1024];
        int len  = 0;
        while((len = inputStream.read(bytes)) != -1){
            outputStream.write(bytes,0,len);
        }
        inputStream.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值