打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
文件上传:SmartUpload和FileUpload


一、文件上传简介


文件上传在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. }  



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. }  


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");

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
servlet 上传文件
Java文件上传类FileUploadUtil.java代码+注释
文件上传
《Java Web应用程序开发》10 Java实用技术
Java文件上传与下载【面试+工作】
Struts 2上传文件小谈
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服