• 文件上传


    一、文件上传简介

     

    文件上传在HTML中是以

    <form action="" method="post" enctype="multipart/form-data">

    <input type="file" name="upload1"/><br />

    <input type="submit" value="上传"/>

    </form>

    形式出现的。

    文件上传有两种选择:

    (1)SmartUpload:以jar包形式出现,需要把他添加到classpath或tomcat的lib文件夹下。

    (2)FileUpload:以jar包形式出现,需要把他添加到classpath或tomcat的lib文件夹下。注意:此包与common-io包是相互依赖的,因此需要同时存放。

    对于SmartUpload,使用较方便,但是官方已经不能下载。

    二、SmartUpload

     

    1.一般代码流程

     

        SmartUpload smart = new SmartUpload();

        smart.initialize(pageContext);

        smart.upload();//准备上传

        smart.save("file");

    实现的功能是将上传到的文件保存在/file文件夹下,并以同名进行保存。

    2.表单注意事项

     

    文件上传规定:表单必须有enctype="multipart/form-data"这个属性;因此表单是以二进制数据发送的,比如表单中有一个text,2个上传控件,发送数据时是一起以二进制发送的。

    3.获取表单中其他普通控件的值

     

    因为有了文件上传控件后,表单的其他控件传递数据不能通过普通的request.getParameter(),而需要smart.getRequest().getParameter();

    4.自定义存储文件名称

     

    String ext = smart.getFiles().getFile(0).getFileExt();// 获得文件后缀

    smart.getFiles().getFile(0).saveAs(this.getServletContext().getRealPath("/")+filename+"."+ext); // 另存为自定义文件名

    filename就是文件自定义名称,ext就是文件扩展名。

    5.随机文件名

    1. package org.random;  
    2. import java.util.*;  
    3. import java.text.*;  
    4. public class IPTimeStamp{  
    5.     private StringBuffer buf;  
    6.     private String ip;  
    7.     public IPTimeStamp(String ip){    //传入参数request.getRemoteAddr();即可   
    8.         this.ip = ip;  
    9.         buf = new StringBuffer();  
    10.     }  
    11.     public String getRandomFileName(){   //取得文件随即名   
    12.         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmssSSS");  
    13.         String[] ipadd = ip.split("\.");  
    14.         for(String ipa:ipadd){  
    15.             buf.append(ipa);  
    16.         }  
    17.         buf.append(sdf.format(new Date()));  
    18.         Random ran = new Random();  
    19.         for(int i=0;i<3;i++){  
    20.             buf.append(ran.nextInt(10));  
    21.         }  
    22.         return buf.toString();  
    23.     }  
    24. }  
    package org.random;
    import java.util.*;
    import java.text.*;
    public class IPTimeStamp{
    	private StringBuffer buf;
    	private String ip;
    	public IPTimeStamp(String ip){    //传入参数request.getRemoteAddr();即可
    		this.ip = ip;
    		buf = new StringBuffer();
    	}
    	public String getRandomFileName(){   //取得文件随即名
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmssSSS");
    		String[] ipadd = ip.split("\.");
    		for(String ipa:ipadd){
    			buf.append(ipa);
    		}
    		buf.append(sdf.format(new Date()));
    		Random ran = new Random();
    		for(int i=0;i<3;i++){
    			buf.append(ran.nextInt(10));
    		}
    		return buf.toString();
    	}
    }

    6.批量上传

     

    for(int i=0;i<smart.getFiles().getCount();i++){

        String ext = smart.getFiles().getFile( i ).getFileExt();

        smart.getFiles().getFile( i ).saveAs(this.getServletContext().getRealPath("/")+filename+"."+ext);

    }即可。

    从以上看出,SmartUpload的代码量不会特别多,比较方便。

    三、FileUpload

     
     
    模板代码:
     
    1. boolean isMultipart = ServletFileUpload.isMultipartContent(request);  
    2. if(isMultipart){    //type=multipart/form-data   
    3.     DiskFileItemFactory factory = new DiskFileItemFactory();  
    4.     ServletFileUpload upload = new ServletFileUpload(factory);  
    5.     upload.setFileSizeMax(1024*1024);                       //设置上传文件的最大容量   
    6.     List<FileItem>items  = upload.parseRequest(request);  //取得表单全部数据   
    7.     for(FileItem item:items){  
    8.         if(item.isFormField()){ //如果不是文件类型   
    9.             //String name = item.getFieldName();    表单中某个控件的名称   
    10.             //String value = item.getString();      表单中某个控件的值   
    11.         }  
    12.         else{  
    13.             //String filename = item.getName(); 返回文件名称   
    14.              File f = null;     //保存的文件   
    15.              item.write(f);             //保存文件   
    16.         }  
    17.     }  
    18. }  
    19. else{  
    20.     //如果没有文件上传   
    21. }  
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    if(isMultipart){	//type=multipart/form-data
    	DiskFileItemFactory factory = new DiskFileItemFactory();
    	ServletFileUpload upload = new ServletFileUpload(factory);
    	upload.setFileSizeMax(1024*1024);        				//设置上传文件的最大容量
    	List<FileItem>items  = upload.parseRequest(request);  //取得表单全部数据
    	for(FileItem item:items){
    		if(item.isFormField()){	//如果不是文件类型
    			//String name = item.getFieldName();	表单中某个控件的名称
    			//String value = item.getString();		表单中某个控件的值
    		}
    		else{
    			//String filename = item.getName(); 返回文件名称
    		     File f = null;		//保存的文件
    		     item.write(f);				//保存文件
    		}
    	}
    }
    else{
    	//如果没有文件上传
    }
     

    FileUpload是apache的commons项目的子项目,需要下载jar包,注意:还要把commons-io.jar也下下来,因为这两个包是相互关联的。

    一般需要导入:

    (1)org.apache.commons.fileupload.*;

    (2)org.apache.commons.fileupload.servlet.*;

    (3)org.apache.commons.fileupload.disk.*;

    1.一般代码流程

     
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);//判断表单的类型是不是multipart/form-data

    DiskFileItemFactory factory = new DiskFileItemFactory();

    ServletFileUpload upload = new ServletFileUpload(factory);

    upload.setFileSizeMax(1024*1024);        //设置上传文件的最大容量

    List<FileItem>items  = upload.parseRequest(request);  //取得表单全部数据

    含有文件上传控件的表单是不能区分一般控件和上传控件的,都作为FileItem;

    2.区分一般控件数据和文件上传控件数据

     

    通过item.isFormField()能够判断,如果返回true,则表示一般控件数据。

    3.FileItem用法

     

    (1)如果是一般控件,则item.getString()即可。

    item.getFieldName()返回域名称。

    (2)如果是文件上传控件,则包含一些方法

            item.getName();    取得上传文件的名称

            item.getContentType();    取得上传文件的mime类型

            long item.getSize();取得上传文件的大小

            item.getInputStream();取得上传文件的输入流

    4.保存文件

     

    在SmartUpload中,只需要save函数即可,但是在FileUpload中,需要IO流。

    InputStream input = item.getInputStream();

    FileOutputStream output = new FileOutputStream("file.txt");

    byte[] buf = new byte[1024];

    int length = 0;

    while((length=input.read(buf))!=-1){

        output.write(buf,0,length);

    }

    input.close();

    output.close();

    即可。

    5.取得文件后缀

     

    String ext = item.getName().split("\.")[1];

    6.对于大文件

    对于打文件,需要设置临时文件夹,形式:

    factory.setRepository("filename");

  • 相关阅读:
    Junit研究心得——准备研究Junit
    Nginx proxying for Tomcat applications
    将工厂模式升华为插件式框架【文摘】
    JIRA中输入验证时,将验证错误“InvalidInputException”写到对应字段顶部,而不是页面顶部。
    Junit研究心得——Junit中的Annotation
    Junit研究心得——Junit中的约定规则
    Java 编程的动态性【文摘】
    插件式设计开发心得(一)【文摘】
    Java SE 6 新特性: Instrumentation 新功能
    php实现首页自动选择语言跳转
  • 原文地址:https://www.cnblogs.com/6502ck/p/3492943.html
Copyright © 2020-2023  润新知