先说一下网上是抄来抄去的真的给我整破防了 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();
}