Web 实现文件上传,下载功能(附上jar包)

首先在我们开始这个任务时,我们需要2个jar包,我这里用的是 commons-fileupload-1.2.1.jar,commons-io-1.4.jar, 如果没有的话我这里可以提供下载。
链接:https://pan.baidu.com/s/1i_QItcsqdrtOZw7MpDg_OQ
提取码:8pei

1.上传功能

(1)首先我们要写一个表单,这个表单提交方法必须要是post方法 因为post方式 没有大小限制。
(2)这个表单的enctype属性必须要设置为multipart/form-data (意味分段发送数据) 应该是。
(3)每个input 必须要有name属性 表单的基本要求差不多是。
下面贴出代码,代码每一步都会有解释,一边看一边理解吧

package com.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;

/**
 * @author fancy
 * @date 2020/5/20 16:40
 */
public class loadServlet extends HttpServlet {
    /**
     * 文件上传功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        if(ServletFileUpload.isMultipartContent(req)){
            // 利用jar包的类创建文件处理工厂  别导错包了
            FileItemFactory fileItemFactory = new DiskFileItemFactory();
            ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
            try {
                // 以fileItemFactory的方式来处理提交的信息 并放回到 list 中
                List<FileItem> list = servletFileUpload.parseRequest(req);
                for(FileItem fileItem : list){ // 遍历每一个 list   ifFormField()方法为是否是普通的表单项
                    if(fileItem.isFormField()){ // 是普通表单项 
                        System.out.println( fileItem.getFieldName() ); // 输出这个表单项的 name属性值
                        System.out.println( fileItem.getString("UTF-8") ); // 输出这个表单项的 value 属性值 可能为中文 所以我们使用 UTF-8编码
                    }
                    else{ // 是文件
                        System.out.println( fileItem.getFieldName() ); // 输出这个表单项的 name属性值
                        System.out.println( fileItem.getName() );  // 输出这个文件的名字
                        fileItem.write(new File("D:\\Game\\"+ fileItem.getName())); // 将该文件上传到哪里
                    }
                }
            }catch (Exception E){
                System.out.println(E);
            }
        }
    }
}

2.下载功能

直接上代码,边看边理解

package com.servlet;

import org.apache.commons.io.IOUtils;
import sun.misc.BASE64Encoder;

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.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

/**
 * @author fancy
 * @date 2020/5/20 19:18
 */
public class download extends HttpServlet {
    /**
     * 文件下载功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取要下载的文件名 假设我们要下载的文件名是6.jpg 这个属性可以从提交的页面获取,这里放了方便就不写页面了
        String downloadname = "6.jpg";
        // 获取要下载的文件路径 并将文件转成流对象
        ServletContext servletContext = getServletContext();
        InputStream resourceAsStream = servletContext.getResourceAsStream("/img/" + downloadname); // servletContext.getResourceAsStream(这里写你这个文件的目录)
        // 告诉客户端这个文件的类型
        String mimeType = servletContext.getMimeType("/img/" + downloadname);
        resp.setContentType(mimeType);
        // 告诉客户端文件是被下载使用的
        // Content-Disposition 表示文件要如何处理  attachment 表示文件用来做附件使用(即下载) filename 表示用户下载文件的名字
        // 当下载的文件名字为中文时,会出现乱码 这个时候 我们要分别对不同浏览器进行处理 火狐使用base64编码  其他使用url编码
        // 我们这个时候要获取浏览器信息  获取浏览器信息可以通过 User-Agent 来获取
        if(req.getHeader("User-Agent").contains("Firefox"))
            resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?"+ new BASE64Encoder().encode("编码问题.jpg".getBytes("UTF-8")) +"?=");
        else
            resp.setHeader("Content-Disposition","attachment;filename = "+ URLEncoder.encode("编码问题.jpg","UTF-8"));
        // 获取要响应的流对象
        ServletOutputStream outputStream = resp.getOutputStream();
        // 通过copy将文件数据发送过去
        IOUtils.copy(resourceAsStream,outputStream); // 利用jar包的类进行操作
    }
}

自己也是边看视频边学的,萌新 有错误麻烦指出呀。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值