导包
基本套路
// 拿到一个文件长传类的工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// Configure a repository (to ensure a secure temp location is used)
//文件上传的时候的临时文件夹
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
//把临时文件夹给到Factory使用
factory.setRepository(repository);
// Create a new file upload handler 使用工厂获取一个文件上传处理器
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem fileItem : items) {
if (fileItem.isFormField()) { //simple form field.
processFormField(fileItem); // J基本的表单数据 文件除外
} else {
System.out.println("ApacheFileupload.doPost() processUploadedFile");
processUploadedFile(fileItem);// 该item是一个文件数据
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
处理函数
try {
InputStream inputStream = item.getInputStream();
String folderString = getServletContext().getRealPath("WEB-INF/upload");
File folder = new File(folderString);
if (!folder.exists()) {
folder.mkdir();
}
FileOutputStream fos = new FileOutputStream(folder+"/1.txt");
int len = 0;
byte[] bs = new byte[1024];
while((len=inputStream.read(bs))!=-1){
fos.write(bs, 0, len);
}
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
几个问题:
上述代码只是个基本上传,如何解决多用户上传文件重名问题?
- 使用系统时间毫秒数
String fileName = System.currentTimeMillis()+item.getFieldName();
- 使用JavaSE提供的UUID
UUID randomUUID = UUID.randomUUID();
String fileName = randomUUID.toString()+item.getFieldName();
其中UUID占128个二进制位,返回结果是32个长度的16进制表示的字符串,分隔符不算。因为每4位用来表示一个16进制数。形如
a328fcc7-bb0d-4205-995b-8d89a6d30056
如果用户上传的所有文件都存储在一个文件夹下,会不会很卡?
- 使用哈希算法使每次上传的文件散列到不用的文件夹下
private void processUploadedFile(FileItem item) {
try {
InputStream inputStream = item.getInputStream();
UUID uuid = UUID.randomUUID();
//文件可以均匀分布,经过这一步uuid看成散列了
//hashCode是32bit,也是得到8个十六进制字符
int hashCode = uuid.toString().hashCode();
//为了可以散列地创建文件夹,得到字符串
String hexString = Integer.toHexString(hashCode());
String realPath = getServletContext().getRealPath("WEB-INF/upload/");
//建立八级文件夹
char[] charArray = hexString.toCharArray();
for (char c : charArray) {
realPath=realPath+c+"/";
}
File folder = new File(realPath);
if (!folder.exists()) {
folder.mkdirs();
}
System.out.println(folder);
File file = new File(folder+"/"+item.getFieldName());
FileOutputStream fos = new FileOutputStream(file);
int len = 0;
byte[] bs = new byte[1024];
while((len=inputStream.read(bs))!=-1){
fos.write(bs, 0, len);
}
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
代码运行效果为