文件上传 Smartupload 和 FileUpload

来源:互联网 发布:final cut por mac 编辑:程序博客网 时间:2024/06/05 00:07

      在web开发中,文件上传是一个很重要的功能,一般我们都会使用上传组件来实现文件的上传,这里介绍两种常见的文件上传组件,smartupload和fileupload。

文件上传有两种选择:

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

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

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


1. smartupload

    这是一个文件上传组件,只不过现在很少有人用到这个组件了,我们在以后的框架开发中用到得都是apache的fileupload文件上传组件。这里简单介绍一下如何使用smartupload组件进行文件上传:

     主要分为3大步骤:初始化上传上下文,准备上传,保存文件

     具体的实现如下:

     (1)下载smartupload.jar,放到WebRoot下的lib目录下

     (2)封装form表单,利用<input type="file" name="myfile" enctype="multipart/form-data">标签元素,这里

              的type属性必须是file,表示文件,除此之外,还必须指定enctype属性为multipart/form-data,如果不

              指定enctype属性,则浏览器默认form表单是按文本数据传输数据的,enctype属性是对form表单的一

              个封装,这里表示按照多媒体的格式上传文件

     (3)编写处理代码

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

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

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

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

原创粉丝点击