DiskFileItemFactory真@理解与文件上传

先说一下网上是抄来抄去的真的给我整破防了
DiskFileItemFactory factory=new DiskFileItemFactory();
factory.setSizeThreshold(1024*10);
factory.setRepository(tmpFile);
//草
//这个方法是DiskFileItemFactory应该是这个意思上传文件时因为文件是一部分一部分的上传 //factory.setSizeThreshold(1024*10)是先把这个文件放在内存中存储TMD,
// 如果大于这个大小要把文件放在磁盘中慢慢上传节约内存,上传完成后你可以在下面 item.delete();//删除临时文件
//不调用这个item方法文件就会在你的web-inf文件夹中存在总一共存放2分文件,一份在你上传完成后的uuid文件夹一份是temp|cao!

刚看了文件上载一直不明白为什么临时文件可以直接通过DiskFileItemFactory存到文件夹中还不用担心重新命名,好多人将DiskFileItemFactory讲的跟直接分类临时文件一样cao了看了半天没明白.

总之临时文件是要你自己写方法分类,这个你可以理解为只是在上传时临时整合文件的.

package com.zjh.Servlet;

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.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;

public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //判断上传的文件是普通表单还是带文件的表单
        if(!ServletFileUpload.isMultipartContent(req))
        {
            return;//终止方法运行说明这是一个普通表单,直接返回
        }
        //创建上传文件的保存路径,建议在WEB-INF下这个文件里的内容用户无法直接访问到,安全
        // getServletContext()获得全局上下文
        String uploadPath=this.getServletContext().getRealPath("/WEB-INF/upload");
        File uploadFile=new File(uploadPath);
        //查看文件是否存在
        if(!uploadFile.exists()){
            uploadFile.mkdir();//若不存在,创建这个目录
        }
        //缓存.临时文件 ;
        //临时路径,若文件超出了预期大小将它存放在一个临时目录中,过几天自动删除或者呢提醒用户给它转为永久文件
        String tempPath=this.getServletContext().getRealPath("/WEB-INF/temp");
        File tmpFile=new File(tempPath);
        //查看文件是否存在
        if(!tmpFile.exists()){
            tmpFile.mkdir();//若不存在,创建这个目录
        }
        //处理上传的文件一般需要流request.getInputStream 原生态来自己写,或者使用封装好的
        //使用Apache的文件上传组件, common-Fileupload,这个组件又依赖commons-io;
        //创建diskfileitemfactory处理文件的上传路径和大小限制;
        DiskFileItemFactory factory=new DiskFileItemFactory();
        factory.setSizeThreshold(1024*10);
        factory.setRepository(tmpFile);
        //草
        //这个方法是DiskFileItemFactory应该是这个意思上传文件时因为文件时一部分一部分的上传 factory.setSizeThreshold(1024*10)是先把这个文件放在内容中存储他妈的,
        // 如果大于这个大小要把文件放在磁盘中慢慢上传节约内存,上传完成后你可以在下面 item.delete();//删除临时文件
        //不调用这个item方法文件就会在你的temp文件夹中存在总工2分文件,一份在你上传完成后的uuid文件夹一份是temp草!
//        factory可选方法
//        factory.setSizeThreshold(1024*1024);//factory的set不用写有默认值
//        factory.setRepository(tmpFile);//设置临时仓库
        //准备完成后创建文件上载对象
        ServletFileUpload upload=new ServletFileUpload(factory);
        //设置文件上载进度监听(并且给他创建监听器)
//        upload可选方法
        upload.setSizeMax(1024*1024*30);
        upload.setProgressListener(new ProgressListener() {
            //第一个参数是已经读取到的文件大小,第二个文件大小,3文件数
            @Override
            public void update(long l, long l1, int i) {
                float now=(float ) l,total=(float )l1;
                System.out.println("总大小:"+l1+",已上传:"+l+":"+(int)(now/total*100)+"%");
            }
        });
//        upload.setHeaderEncoding();
//        可以设置upload的乱码问题.....
        //处理上传的文件
        try {
            //将发送来的数据表单中的对象通过upload对象解析成FileitemList
            List<FileItem> fileItems=upload.parseRequest(req);
            //遍历每个List中的对象判断需要上载的文件并上载
            for (FileItem item : fileItems)
            {
                //判断对象是否是表单中的普通类还是文件类
                if(item.isFormField())
                {
                    //       getFieldName是获得表单中输入框的name
                    String name=item.getFieldName();
                    String value=item.getString("UTF-8");//乱码处理
                    System.out.println(name+":"+value);
                }else{
                    //文件
                    String uploadFileName= item.getName();
                    //防止文件名不合法
                    if(uploadFileName.trim().equals("")||uploadFileName==null){
                        continue;
                    }
                    String fileName=uploadFileName.substring(uploadFileName.lastIndexOf("/")+1);//文件整体名
                    String fileExtName=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);//后缀名
                    //网络中传输的东西都需要序列化
                    //pojo,实体类,如果想要在多个电脑中运行, 传输====>需要把对象序列化
                    //JNI JAVA native  interface
                    //implements Serializable:标记接口 ,JVM-->java栈 本地方法栈 native --->C++;
                    String uuidPath= UUID.randomUUID().toString();
                    //随机生成一个uuid随机序列
                    //----------------------------------存放地址------//
                    String realPath=uploadPath+"/"+uuidPath;
                    //目的是给每个文件创建一个对应的不会冲突的文件夹
                    File realPathFile=new File(realPath);
                    if(!realPathFile.exists()){
                        realPathFile.mkdir();
                    }
                    ///文件传输
                    System.out.println("文件大小:"+item.getSize());
                    InputStream inputStream=item.getInputStream();
                    FileOutputStream fos=new FileOutputStream(realPath+"/"+fileName);
                    byte [] buffer=new byte[1024*1024];
                    int len =0;
                    //inputStream.read()此方法将数据读入缓冲区,若数据度完了返回-1返回的是ASC数值0-255
                    while ((len=inputStream.read(buffer))>0)
                    {
                        fos.write(buffer,0,len);//写入文件的量,buffer是缓冲区,0是起始量,len是末尾长
                        fos.flush();
                    }
                    fos.close();
                    inputStream.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、付费专栏及课程。

余额充值