文件上传在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 smart = new SmartUpload();
smart.initialize(pageContext);
smart.upload(); //准备上传
smart.save("file");
实现的功能是将上传到的文件保存在/file文件夹下,并以同名进行保存。
文件上传规定:表单必须有enctype="multipart/form-data"这个属性;因此表单是以二进制数据发送的,比如表单中有一个text,2个上传控件,发送数据时是一起以二进制发送的。
因为有了文件上传控件后,表单的其他控件传递数据不能通过普通的request.getParameter(),而需要smart.getRequest().getParameter();
String ext = smart.getFiles().getFile(0).getFileExt();// 获得文件后缀
smart.getFiles().getFile(0).saveAs(this.getServletContext().getRealPath("/")+filename+"."+ext); // 另存为自定义文件名
filename就是文件自定义名称,ext就是文件扩展名。
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();
}
}
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的代码量不会特别多,比较方便。
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.*;
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(1024*1024); //设置上传文件的最大容量
List<FileItem>items = upload.parseRequest(request); //取得表单全部数据
含有文件上传控件的表单是不能区分一般控件和上传控件的,都作为FileItem;
通过item.isFormField()能够判断,如果返回true,则表示一般控件数据。
(1)如果是一般控件,则item.getString()即可。
item.getFieldName()返回域名称。
(2)如果是文件上传控件,则包含一些方法
item.getName(); 取得上传文件的名称
item.getContentType(); 取得上传文件的mime类型
long item.getSize();取得上传文件的大小
item.getInputStream();取得上传文件的输入流
在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();
即可。
String ext = item.getName().split("\\.")[1];
对于打文件,需要设置临时文件夹,形式:
factory.setRepository("filename");