单多文件上传


## 关于SSM文件上传和Java文件上传的方式比对

本人一学生,想将所学的东西再这里记录下来,写的不好请多指教。
首先,先上javaweb实现的代码。

package multi;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
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.Calendar;
import java.util.List;

/**
 *
 * 作业2
 *
 * 具体页面为multipate.jsp
 *
 * 1)临时文件 文件发送时会把文件分开一份一份,随机发送到临时文件里temp目录,然后最后再指定文件里最后合成
 *   设置临时文件的边界,大于该值,上传文件会先保存再临时文件中,否则,上传文件将直接写入内存中
 *   fac.setSizeThreshold(1024*1024*1);
 *   fac.setRepository(new File(tempPath));
 *
 * 2)解决乱码问题
 * String value = item.getString("utf-8");
 * 特别的是   1)文件名乱码问题   2)上传文件同名问题
 *
 * 3)文件上传大小的限制
 *  upload.setFileSizeMax(1024*1024*10);                   //设置单个上传文件的最大边界值
 *  upload.setSizeMax(1024*1024*100);                      //设置多个上传文件的最大边界值
 *
 * 4)文件目录的管理 按照每天创建一个                         避免该文件夹由于文件数量过多而装不下的情况
 */
@WebServlet("/mul2")
public class muk2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
    //使用fileupload工具类
        if(!ServletFileUpload.isMultipartContent(req)){//判断返回的是否为multipart的请求

            throw new RuntimeException("当前请求不支持文件上传");

        }
            String path = this.getServletContext().getRealPath("/code/img");//----------获取文件保存在服务器的路劲

            String tempPath = this.getServletContext().getRealPath("/code/temp");//----------------临时文件的地址

        try {
            DiskFileItemFactory fac = new DiskFileItemFactory();//------------------------创建工厂 把文件存到磁盘上(大的)

            fac.setSizeThreshold(1024*1024*1);                  //-------------------------设置临时文件为1mb

            fac.setRepository(new File(tempPath));              //-------------------------设置临时文件的地址

            ServletFileUpload upload = new ServletFileUpload(fac);//-----------------------创建上传的核心组件

            Calendar now = Calendar.getInstance();                //用Calendar获取日期

            int year = now.get(Calendar.YEAR);
            int month = now.get(Calendar.MONTH) + 1;
            int day = now.get(Calendar.DAY_OF_MONTH);
            path = path + "/" + year + "/" + month + "/" + day;         //在img目录下添加文件夹的
            File file = new File(path);

            if(!file.exists()){                                   //如果文件夹不存在就创建新目录
                boolean mkdir = file.mkdirs();
                if(mkdir){
                    System.out.println("创建成功");
                }
            }

            upload.setHeaderEncoding("utf-8");                    //在核心组件处解决文件名的乱码问题

            upload.setFileSizeMax(1024*1024*100);                   //设置单个上传文件的最大边界值     100M

            upload.setSizeMax(1024*1024*1000);                      //设置多个上传文件的最大边界值    1000M

            List<FileItem> items = upload.parseRequest(req);  //------------------------解析请求

            for (FileItem item : items) {                      //------------------------遍历items  可以处理多文件上传
                if(item.isFormField()){                       //------------------------为普通表单项

                    String fieldName = item.getFieldName();

                    String value = item.getString("utf-8");//解决乱码问题

                    System.out.println(fieldName + value);

                }else {                                       //------------------------为文件表单项

                    String fieldName = item.getName();

                    fieldName = fieldName + System.currentTimeMillis();//---------------给文件名加上毫秒避免了同文件名上传不了

                    String value = item.getString();

                    System.out.println(fieldName);

                    InputStream is = item.getInputStream();

                    OutputStream os = new FileOutputStream(new File(path, fieldName));//保存的路径

                    //将输入流的数据写入输出流里
                    byte[] buffer = new byte[1024];
                    int len = -1;
                    while ((len = is.read(buffer)) != -1){
                        os.write(buffer,0,len);
                    }
                    os.close();
                    is.close();
                    item.delete();                          //--------------------------临时文件的删除
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }

要实现文件的上传,前端的页面必须满足两个条件:
1)post提交请求
2)表单项带enctype=“multipart/form-data”
3)表单文件type为file,type=“file”

然后现在分析一下
1)ServletFileUpload.isMultipartContent(req)判断是否为表单文件上传
2) DiskFileItemFactory fac = new DiskFileItemFactory();创建文件上传的工厂
临时文件 文件发送时会把文件分开一份一份,随机发送到临时文件里temp目录,然后最后再指定文件里最后合成

  • 设置临时文件的边界,大于该值,上传文件会先保存再临时文件中,否则,上传文件将直接写入内存中
  • fac.setSizeThreshold(1024*1024);
  • fac.setRepository(new File(tempPath));
    --------相关方法:
    setSizeThreshold:设置临时文件的大小
    setRepository:设置临时文件的上传地址
    3)ServletFileUpload upload = new ServletFileUpload(fac);通过工厂创建组件
    还有一些关于他的方法
    setHeaderEncoding(“utf-8”);设置文件名的编码
    setFileSizeMax(10241024100);设置单个文件大小的上限
    setSizeMax(102410241000);设置多个个文件大小的上限

下面是关于ssm的文件上传,它相对javaweb封装了起来,直接调用即可

public void l(String username, MultipartFile upload,MultipartFile upload2) throws IOException {
        System.out.println(username);
        System.out.println(upload);
        System.out.println(upload2);
        String fileName = upload.getOriginalFilename();//获取文件名
        upload.transferTo(new File("C:\\Users\\86135\\Desktop\\java\\day1\\"+fileName));
    }

最后一个是关于对他们文件夹维护,因为如果每天下载图片,很可能造成文件夹的文件数量达到上限,所以可以在创建文件时管理文件夹。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding(“utf-8”);

    //使用fileupload工具类
    if(!ServletFileUpload.isMultipartContent(req)){//判断返回的是否为multipart的请求

        throw new RuntimeException("当前请求不支持文件上传");

    }
        String path = this.getServletContext().getRealPath("/code/img");//----------获取文件保存在服务器的路劲

        String tempPath = this.getServletContext().getRealPath("/code/temp");//----------------临时文件的地址

    try {
        DiskFileItemFactory fac = new DiskFileItemFactory();//------------------------创建工厂 把文件存到磁盘上(大的)

        fac.setSizeThreshold(1024*1024*1);                  //-------------------------设置临时文件为1mb

        fac.setRepository(new File(tempPath));              //-------------------------设置临时文件的地址

        ServletFileUpload upload = new ServletFileUpload(fac);//-----------------------创建上传的核心组件

        Calendar now = Calendar.getInstance();                //用Calendar获取日期

        int year = now.get(Calendar.YEAR);
        int month = now.get(Calendar.MONTH) + 1;
        int day = now.get(Calendar.DAY_OF_MONTH);
        path = path + "/" + year + "/" + month + "/" + day;         //在img目录下添加文件夹的
        File file = new File(path);

        if(!file.exists()){                                   //如果文件夹不存在就创建新目录
            boolean mkdir = file.mkdirs();
            if(mkdir){
                System.out.println("创建成功");
            }
        }

        upload.setHeaderEncoding("utf-8");                    //在核心组件处解决文件名的乱码问题

        upload.setFileSizeMax(1024*1024*100);                   //设置单个上传文件的最大边界值     100M

        upload.setSizeMax(1024*1024*1000);                      //设置多个上传文件的最大边界值    1000M

        List<FileItem> items = upload.parseRequest(req);  //------------------------解析请求

        for (FileItem item : items) {                      //------------------------遍历items  可以处理多文件上传
            if(item.isFormField()){                       //------------------------为普通表单项

                String fieldName = item.getFieldName();

                String value = item.getString("utf-8");//解决乱码问题

                System.out.println(fieldName + value);

            }else {                                       //------------------------为文件表单项

                String fieldName = item.getName();

                fieldName = fieldName + System.currentTimeMillis();//---------------给文件名加上毫秒避免了同文件名上传不了

                String value = item.getString();

                System.out.println(fieldName);

                InputStream is = item.getInputStream();

                OutputStream os = new FileOutputStream(new File(path, fieldName));//保存的路径

                //将输入流的数据写入输出流里
                byte[] buffer = new byte[1024];
                int len = -1;
                while ((len = is.read(buffer)) != -1){
                    os.write(buffer,0,len);
                }
                os.close();
                is.close();
                item.delete();                          //--------------------------临时文件的删除
            }
        }
    } catch (FileUploadException e) {
        e.printStackTrace();
    }

}

到时他的目录如下,每天会创建一个文件夹,而且文件会自带时间戳,防止文件同名的问题。注解十分清晰。
在这里插入图片描述

以上,就是关于文件上传的问题总结。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值