栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Servlet两种上传文件方式的tips

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Servlet两种上传文件方式的tips

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

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


相关的处理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;



@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 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);
        }
    }

    
    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 文件上传

相关依赖


            commons-io
            commons-io
            2.8.0
        
        
            commons-fileupload
            commons-fileupload
            1.4
        

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;


@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 可以理解为part的集合
            List 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项目中

 以上

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992659.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号