Servlet两种上传文件方式的tips

1.使用 Servlet 3.1 内置的文件上传功能

表单内的type类型为file,请求方式为POST,enctype为multipart/form-data

<form method="post" enctype="multipart/form-data" action="uploadFile">
    <input type="file" name="myFile"/><br/>
    <input type="submit" value="上传">
</form>

相关的处理Servlet

package com.dendi.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.Collection;


/**
 * @author Dendi
 * 处理上传的servlet
 */
@WebServlet("/uploadFile")
@MultipartConfig(maxFileSize = 5*1024*1024)
public class UploadServlet extends HttpServlet {

    private final String UPLOAD_FILE = "D:\\IdeaProjects\\hearthstonedata\\web\\WEB-INF\\uploadFile";
    @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 {
        //获取part集合
        Collection<Part> parts = req.getParts();
        for (Part part : parts) {
            //获取相应的请求头信息
            String header = part.getHeader("content-disposition");
            //通过工具类获取文件名
            String fileName = getFileName(header);
            //实际需要上传的地址
            String filePathName = UPLOAD_FILE+File.separator +fileName;
            //String filePathName = "D:\\IdeaProjects\\hearthstonedata\\web\\WEB-INF\\uploadFile\\"+fileName;
            part.write(filePathName);
        }
    }

    /**
     * 获取文件名
     * @param header
     * @return
     */
    private String getFileName(String header){
        String[] split = header.split("; ");
        String item = null;
        for (String s : split) {
            if(s.startsWith("filename=")){
                item = s;
                break;
            }
        }
        int start = item.indexOf('"')+1;
        int end = item.lastIndexOf('"');
        String fileName = item.substring(start,end);
        System.out.println(fileName);
        return fileName;
    }
}

2.使用commons-fileupload 文件上传

相关依赖

<dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

commons-fileupload上传将资源定义为FileItem,可以理解为第一种方式的part

Servlet

package com.dendi.servlet;

import org.apache.commons.fileupload.FileItem;
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.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author Dendi
 * 使用commons-fileupload实现文件上传
 */
@WebServlet("/fileUpload")
public class CommonsServlet 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 {
        // 创建DiskFileItemFactory对象,该对象为解析器提供了缺省的配置
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 创建解析器
        ServletFileUpload sfu = new ServletFileUpload(factory);
        try{
            //List<FileItem> 可以理解为part的集合
            List<FileItem> items = sfu.parseRequest(req);
            for (FileItem item : items) {
                //判断普通文本域和文件上传域
                if(item.isFormField()){
                    //普通文本域
                    String name = item.getString();
                    System.out.println("username="+name);
                }else{
                    //文件上传域 获取上下文对象
                    ServletContext context = getServletContext();
                    // 获取文件上传目标目录的路径 会在upload的前面加上部署项目的项目根路径
                    String upload = context.getRealPath("upload");
                    File file = new File(upload);
                    if(!file.exists()){
                        file.mkdir();
                    }
                    //获取文件名
                    String name = item.getName();
                    File file1 = new File(upload+File.separator+name);
                    System.out.println("上传到服务器后的文件路径:" + file1);
                    item.write(file1);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

这里需要注意的,使用commons-fileupload进行文件上传,在pom添加依赖后,如果启动报错,错误信息为java.lang.NoClassDefFoundError: org/apache/commons/io/IOUtils 等等

需要在idea的Project Structure 进行相关设置,将依赖添加到web项目中

 以上

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值