jsp+servlet 实现多文件上传[文件大小,类别可控制]

本文介绍了使用Servlet实现多文件上传的方法,包括设置文件上传目录、解析请求获取文件项、处理普通表单和文件表单,并确保文件上传过程的安全性和高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.cnblogs.xmc5788;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 *  servlet 实现多文件上传
 */
public class FileUpload extends HttpServlet {
    private static final long serialVersionUID = 1L;



    /**
     * 缺省构造函数
     */
    public FileUpload() {
        super();
        // TODO Auto-generated constructor stub
    }

 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        response.setContentType("text/html;charset=gb2312");  //设置文件头形式
        PrintWriter out = null;
        try {
            out = response.getWriter(); 
        } catch (IOException e1) {
            e1.printStackTrace();
        }
         // 得到该应用下的upload目录在服务器上的绝对路径
        String path = request.getSession().getServletContext().getRealPath("upfile");
        if (path == null) {// 如果为空表示不能访问,可能是系统设置了访问权限
            out.print("无法访问该目录!");
            return;
        }

        File uploadDir = new File(path);// 得到该目录的文件对象
        if (!uploadDir.exists()) {// 判断该目录是否存在
            if (!uploadDir.mkdir()) {// 如果不存在就建立该目录
                out.print("无法创建该目录!");// 如果建立失败,给出提示
                return;
            }
        }

        if (!ServletFileUpload.isMultipartContent(request)) {
            out.print("只能 multipart/form-data 类型数据");
            return;
        }
        // 创建 DiskFileItemFactory 对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // factory.setRepository(tempDir);可以设置缓存目录
        factory.setSizeThreshold(1024 * 1024);// 超过1m的数据采用临时文件缓存
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setFileSizeMax(1024 * 1024 * 2);// 单个文件大小
        upload.setHeaderEncoding("gb2312");// 设置普通字段名称和文件字段的文件名所采用的字符集编码
        upload.setSizeMax(1024 * 1024 * 4);// 最多上传2m的文件

        List<FileItem> list = null;
        try {
            list = upload.parseRequest(request); //解析request对象 得到一个FileItem对象
        } catch (FileUploadException e) {
            out.print("解析文件时出现问题:");
            e.printStackTrace();
            return;
        }

        Iterator<FileItem> it = list.iterator();// 遍历list
        while (it.hasNext()) {
            FileItem fi = (FileItem) it.next();// 类型转换

     System.out.println("该文件表单name为:" + fi.getFieldName());
            System.out.println("该文件文件名为:" + fi.getName());
            System.out.println("该文件文件类型为:" + fi.getContentType());
            System.out.println("该文件文件大小为:" + fi.getSize());
            if (fi.isFormField()) {// 判断该 FileItem 对象是否是一个普通表单类型
                String name = fi.getFieldName();// 得到普通表单类型的表单名
                String content = null;
                try {
                    content = fi.getString("GB2312");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }// 用指定编码得到普通表单的值
                request.setAttribute(name, content);// 把键值放入 request 对象
            } else {
                try {
                    String pathStr = fi.getName();// 得到文件表单的值,就是用户本地的文件路径
                    // 如果文件表单为空,则不处理
                    if (pathStr.trim().equals("")) {
                        continue;
                    }
                    int start = pathStr.lastIndexOf("\\");// 得到文件名在路径中的位置
                    String fileName = pathStr.substring(start + 1);// 得到文件名
                    File pathDest = new File(path, fileName);
                    System.out.println(fileName);
                    fi.write(pathDest);// 写文件
                    String name = fi.getFieldName();// 得到文件表单的名称
                    request.setAttribute(name, fileName);// 把表单名、文件名放入 request

                } catch (Exception e) {
                    out.print("存储文件错误:");
                    e.printStackTrace();
                    return;
                } finally {// 立即删除保存表单字段内容的临时文件
                    fi.delete();
                }
            }
        }
    }

   

}

转载于:https://www.cnblogs.com/xmc5788/archive/2012/02/11/2346554.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值