文件的上传和下载

文件的上传

  1. 要有一个form标签,method=post请求
  2. form标签的 enctype 属性值必须为 multipart/form-data,表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器
  3. 在form标签中使用 input type="file" 添加上传的文件
  4. 编写服务器代码接收、处理上传的数据
<form action="http://localhost:8080/myjavaweb/receiveServlet" enctype="multipart/form-data" method="post">
	用户名:<input type="text" name="username"/><br>
	头  像:<input type="file" name="photo"/><br>
	<input type="submit" value="上传">
</form>

  

 

//服务器用流的形式接收数据
ServletInputStream inputStream = req.getInputStream();
byte[] buffer = new byte[1024000];
int read = inputStream.read(buffer);
System.out.println(new String(buffer, 0, read));

  

 commons.fileload常用API

引入依赖

 

 

 

ServletFileUpload类:用于解析上传的数据

FileItem类:表示每一个表单项

 

判断当前上传的数据格式是否是多段的格式:boolean ServletFileUpload.isMultipartContent(HttpServletRequest request)
解析上传的数据:public List<FileItem> parseRequest(HttpServletRequest request)
判断当前这个表单项,是普通的表单项,还是上传的文件类型,true表示普通类型的表单项,false表示上传的文件类型:boolean FileItem.isFormField()
获取表单项的name属性值:String FileItem.getFieldName()
获取当前表单项的值:String FileItem.getString()
获取上传的文件名:String FileItem.getName()
将上传的文件写到参数 file指向的磁盘位置:void FileItem.write(file)

 

package com.tang.web.servlet;



import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
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;

public class Response1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、先判断上传的数据是否多段数据(是多段的数据,才是文件上传
        if (ServletFileUpload.isMultipartContent(req)){
            //创建FileItemFactory工厂实现类
            FileItemFactory factory = new DiskFileItemFactory();
            //创建用于解析上传数据的工具类ServletFileUpload类
            ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
            //解析上传的数据,得到每一个表单项FileItem
            try {
                List<FileItem> list = servletFileUpload.parseRequest(req);
                //循环判断每一个表单项,是普通类型还是上传的文件
                for (FileItem item : list) {
                    if (item.isFormField()){
                        //普通表单项
                        System.out.println("name属性:"+item.getFieldName());
                        System.out.println("表单项的值:"+item.getString("UTF-8"));   //解决乱码问题
                    }
                    else {
                        //上传文件
                        System.out.println("name属性:"+item.getFieldName());
                        System.out.println("上传的文件名:"+item.getName());
                        item.write(new File("F:\\大学作业\\我的学习\\包\\"+item.getName()));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

  

文件的下载

package com.tang.web.servlet;



import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
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 java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;

public class Response1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、获取要下载的文件名
        String downloadFileNama = "baihe0..jpg";

        //2、读取要下载的文件内容(通过ServletContext对象可以读取)
        ServletContext servletContext = getServletContext();
        //获取要下载的文件的类型
        String mimeType = servletContext.getMimeType("/file/" + downloadFileNama);
        //通过响应头告诉客户端返回的数据类型
        resp.setContentType(mimeType);

        //告诉客户端收到的数据是用于下载使用(使用响应头)
        //Content-Disposition 表示收到的数据怎么处理
        //attachment    表示附件,表示下载使用
        //filename=     表示指定下载的文件名
        //URLEncoder.encode(downloadFileNama,"UTF-8")  解决中文下载名乱码的问题,url编码将汉字转换成%xx%xx的格式
        resp.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(downloadFileNama,"UTF-8"));

        InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileNama);
        //获取响应的输出流
        ServletOutputStream outputStream = resp.getOutputStream();
        //读取输入流中的全部数据,复制给输出流,输出给客户端
        //3、把下载的文件内容回传给客户端
        IOUtils.copy(resourceAsStream, outputStream);

    }
}

  

 

posted @ 2021-04-07 11:57  455994206  阅读(67)  评论(0)    收藏  举报