文件上传(java版)

//文件上传
package com.xxx.file;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

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.*;
import java.util.List;

@WebServlet("/file/upload")
public class uploadApi 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 {
        //判断是否是multipart请求
        if(!ServletFileUpload.isMultipartContent(req)){
            System.out.println("不是Multipart请求");
        }
        try {
            //创建FileItem工厂
            DiskFileItemFactory factory=new DiskFileItemFactory();
            //设置临时文件的边界值,超过边界值就会创建临时文件,不超过则直接上传到文件
            factory.setSizeThreshold(1024*1024*1);  //1M
            //设置临时文件目录
            String tempPath=this.getServletContext().getRealPath("/temp");
            //如果临时文件目录不存在,就创建临时文件目录
            File tempjia=new File(tempPath);
            if(!tempjia.exists()){
                tempjia.mkdirs();
            }
            File temp=new File(tempPath);
            factory.setRepository(temp);
            //文件上传核心组件
            ServletFileUpload upload=new ServletFileUpload(factory);
            //设置图片中文时的编码
            upload.setHeaderEncoding("utf-8");
            //设置单个文件上传的最大值
            upload.setFileSizeMax(1024*1024*2); //2M
            //设置多个文件上传的最大值
            upload.setSizeMax(1024*1024*5); //5M
            upload.setProgressListener(new ProgressListener() {
                @Override
                public void update(long pBytesRead, long pContentLength, int pItems) {
                    System.out.println("总大小:" + pContentLength + "已上传:" + pBytesRead);
                }
            });
            List<FileItem> items=upload.parseRequest(req);
            //空文件标志,如果不走for就代表没有文件,直接响应失败,走for就值nullflag=true,响应成功
            boolean nullflag=false;
            //遍历请求参数
            for (FileItem item:items) {
                if(item.isFormField()){                 //普通表单项
                    String aname=item.getFieldName();
                    String avalue=item.getString("utf-8");  //设置普通参数字符集
                }else{                                  //文件
                    InputStream is=item.getInputStream();
                    String filename=item.getName();
                    System.out.println(filename);   //文件名
                    //判断文件格式是否正确
                    String fileType=filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
                    System.out.println(fileType);   //输出文件格式
                    if(!fileType.equals("jpg")){
                        resp.setContentType("charset=utf-8");
                        String result = "{\"msg\":\"typeerror\"}";
                        resp.getWriter().print(result);
                        return;
                    }
                    //上传到服务器的路径
                    String path=this.getServletContext().getRealPath("/images");
                    File filejia=new File(path);
                    if(!filejia.exists()){
                        filejia.mkdirs();
                    }
                    File myfile=new File(path,filename);
                    //写入到输出流,存文件
                    OutputStream os=new FileOutputStream(myfile);
                    int len=-1;
                    byte[] buf=new byte[1024];
                    while ((len=is.read(buf))!=-1){
                        os.write(buf,0,len);
                    }
                    //关闭输入流和输出流
                    os.close();
                    is.close();
                    //删除临时文件
                    item.delete();
                    //表示文件不为空
                    nullflag=true;
                    //设置成功后的响应消息
                    resp.setContentType("charset=utf-8");
                    String result = "{\"msg\":\"yes\"}";
                    resp.getWriter().print(result);
                }
            }
            //true表示文件不为空,false表示文件为空
            if(!nullflag){
                resp.setContentType("charset=utf-8");
                String result = "{\"msg\":\"nullfile\"}";
                resp.getWriter().print(result);
            }
        } catch (FileUploadException e) {
            //设置失败后的响应消息
            resp.setContentType("charset=utf-8");
            String result = "{\"msg\":\"no\"}";
            resp.getWriter().print(result);
            e.printStackTrace();
        }
    }
}

注意:使用文件上传和文件下载时都需要引用一下两个坐标

<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
</dependency>
<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
</dependency>
posted @   Lcode_mask  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示