導(dǎo)包

image.png
基本套路
// 拿到一個文件長傳類的工廠
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基本的表單數(shù)據(jù) 文件除外
} else {
System.out.println("ApacheFileupload.doPost() processUploadedFile");
processUploadedFile(fileItem);// 該item是一個文件數(shù)據(jù)
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
處理函數(shù)
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();
}
幾個問題:
上述代碼只是個基本上傳,如何解決多用戶上傳文件重名問題?
- 使用系統(tǒng)時間毫秒數(shù)
String fileName = System.currentTimeMillis()+item.getFieldName();
- 使用JavaSE提供的UUID
UUID randomUUID = UUID.randomUUID();
String fileName = randomUUID.toString()+item.getFieldName();
其中UUID占128個二進制位,返回結(jié)果是32個長度的16進制表示的字符串,分隔符不算。因為每4位用來表示一個16進制數(shù)。形如
a328fcc7-bb0d-4205-995b-8d89a6d30056
如果用戶上傳的所有文件都存儲在一個文件夾下,會不會很卡?
- 使用哈希算法使每次上傳的文件散列到不用的文件夾下
private void processUploadedFile(FileItem item) {
try {
InputStream inputStream = item.getInputStream();
UUID uuid = UUID.randomUUID();
//文件可以均勻分布,經(jīng)過這一步uuid看成散列了
//hashCode是32bit,也是得到8個十六進制字符
int hashCode = uuid.toString().hashCode();
//為了可以散列地創(chuàng)建文件夾,得到字符串
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();
}
}
代碼運行效果為

image.png