单多文件上传


## 关于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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将Apache的commons-fileupload.jar放在应用程序的WEB-INF\lib下,即可使用。下面举例介绍如何使用它的文件上传功能。 所使用的fileUpload版本为1.2,环境为Eclipse3.3+MyEclipse6.0。FileUpload 是基于 Commons IO的,所以在进入项目前先确定Commons IO的jar包(本文使用commons-io-1.3.2.jar)在WEB-INF\lib下。 此文作示例工程可在文章最后的附件中下载。 示例1 最简单的例子,通过ServletFileUpload静态类来解析Request,工厂类FileItemFactory会对mulipart类的表单中的所有字段进行处理,不只是file字段。getName()得到文件名,getString()得到表单数据内容,isFormField()可判断是否为普通的表单项。 demo1.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> //必须是multipart的表单数据。 <form name="myform" action="demo1.jsp" method="post" enctype="multipart/form-data"> Your name: <br> <input type="text" name="name" size="15"><br> File:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> demo1.jsp <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="java.util.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% boolean isMultipart = ServletFileUpload.isMultipartContent(request);//检查输入请求是否为multipart表单数据。 if (isMultipart == true) { FileItemFactory factory = new DiskFileItemFactory();//为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。 ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); Iterator<FileItem> itr = items.iterator(); while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); //检查当前项目是普通表单项目还是上传文件。 if (item.isFormField()) {//如果是普通表单项目,显示表单内容。 String fieldName = item.getFieldName(); if (fieldName.equals("name")) //对应demo1.html中type="text" name="name" out.print("the field name is" + item.getString());//显示表单内容。 out.print("<br>"); } else {//如果是上传文件,显示文件名。 out.print("the upload file name is" + item.getName()); out.print("<br>"); } } } else { out.print("the enctype must be multipart/form-data"); } %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> </body> </html> 结果: the field name isjeff the upload file name isD:\C语言考试样题\作业题.rar 示例2 上传两个文件到指定的目录。 demo2.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> <form name="myform" action="demo2.jsp" method="post" enctype="multipart/form-data"> File1:<br> <input type="file" name="myfile"><br> File2:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> demo2.jsp <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%String uploadPath="D:\\\\temp"; boolean isMultipart = ServletFileUpload.isMultipartContent(request); if(isMultipart==true){ try{ FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request);//得到所有的文件 Iterator<FileItem> itr = items.iterator(); while(itr.hasNext()){//依次处理每个文件 FileItem item=(FileItem)itr.next(); String fileName=item.getName();//获得文件名,包括路径 if(fileName!=null){ File fullFile=new File(item.getName()); File savedFile=new File(uploadPath,fullFile.getName()); item.write(savedFile); } } out.print("upload succeed"); } catch(Exception e){ e.printStackTrace(); } } else{ out.println("the enctype must be multipart/form-data"); } %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> </body> </html> 结果: upload succeed 此时,在"D:\temp"下可以看到你上传的两个文件。 示例3 上传一个文件到指定的目录,并限定文件大小。 demo3.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> <form name="myform" action="demo3.jsp" method="post" enctype="multipart/form-data"> File:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> demo3.jsp <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% File uploadPath = new File("D:\\temp");//上传文件目录 if (!uploadPath.exists()) { uploadPath.mkdirs(); } // 临时文件目录 File tempPathFile = new File("d:\\temp\\buffer\\"); if (!tempPathFile.exists()) { tempPathFile.mkdirs(); } try { // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb factory.setRepository(tempPathFile);//设置缓冲区目录 // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB List<FileItem> items = upload.parseRequest(request);//得到所有的文件 Iterator<FileItem> i = items.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); String fileName = fi.getName(); if (fileName != null) { File fullFile = new File(fi.getName()); File savedFile = new File(uploadPath, fullFile .getName()); fi.write(savedFile); } } out.print("upload succeed"); } catch (Exception e) { e.printStackTrace(); } %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> </body> </html> 示例4 利用Servlet来实现文件上传Upload.java package com.zj.sample; import java.io.File; import java.io.IOException; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; @SuppressWarnings("serial") public class Upload extends HttpServlet { private String uploadPath = "D:\\temp"; // 上传文件的目录 private String tempPath = "d:\\temp\\buffer\\"; // 临时文件目录 File tempPathFile; @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb factory.setRepository(tempPathFile);// 设置缓冲区目录 // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB List<FileItem> items = upload.parseRequest(request);// 得到所有的文件 Iterator<FileItem> i = items.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); String fileName = fi.getName(); if (fileName != null) { File fullFile = new File(fi.getName()); File savedFile = new File(uploadPath, fullFile.getName()); fi.write(savedFile); } } System.out.print("upload succeed"); } catch (Exception e) { // 可以跳转出错页面 e.printStackTrace(); } } public void init() throws ServletException { File uploadFile = new File(uploadPath); if (!uploadFile.exists()) { uploadFile.mkdirs(); } File tempPathFile = new File(tempPath); if (!tempPathFile.exists()) { tempPathFile.mkdirs(); } } } demo4.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> // action="fileupload"对应web.xml中<servlet-mapping>中<url-pattern>的设置. <form name="myform" action="fileupload" method="post" enctype="multipart/form-data"> File:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> web.xml <servlet> <servlet-name>Upload</servlet-name> <servlet-class>com.zj.sample.Upload</servlet-class> </servlet> <servlet-mapping> <servlet-name>Upload</servlet-name> <url-pattern>/fileupload</url-pattern> </servlet-mapping>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值