真实项目中SpringMvc+ajax 文件上传需要注意的问题
在平时的文件上传中,往往我们仅仅只是实现功能就可以算是完成任务了,而在实际的javaWeb开发项目中,有很多注意点需要我们进行注意,以下是我做完项目后总结的几点经验,不足之处还忘见谅。当然一些jar包的导入就不一一列举出来了
一、文件大小问题
在真实项目中需要考虑到文件的大小问题,以一个upload.properties的配置文件来填写一些文件上传的一些基本参数来判断上传的文件是否符合上传的条件,并给与在页面上提示
#允许图片类型
allowed.image=bmp|gif|jpg|jpeg|png
#允许附件类型
allowed.files=7z|apk|aiff|asf|avi|csv|doc|docx|fla|flv|gz|gzip|mid|mov|mp3|mp4|mpc|mpeg|mpg|ods|odt|pdf|ppt|pptx|pxd|qt|ram|rar|rm|rmi|rmvb|rtf|sdc|sitd|swf|sxc|sxw|tar|tgz|tif|tiff|txt|vsd|wav|wma|wmv|xls|xlsx|xml|zip
#不允许类型
denied.files=exe|bin|
#最大文件大小
allowed.maxkb=102400
#自动命名
auto.filename=false
#自动覆盖
auto.overwrite=false
#保存路径(e.g. E:\\files)
save.FolderPath=
#保存文件夹
save.Folder=uploadFiles
加粗样式
二、文件重名问题及在页面上的显示
一个人上传一个文件是不会出现这种显现的,那么多个人上传多个文件,或者一个人上传多个重复的文件,那么这时候就会出现无法在服务器辨别哪个文件是上传的文件,所以一般采用在原文件名后增加当前时间用以区分真正的文件
/**
* 获取附件[name,path]
*
* @param pd
* @param codePath
* @return
*/
protected String[] getAttachment(PageData pd, String codePath) {
String[] str = { "", "" };
String uploadNames = pd.getString("uploadNames");
String uploadPaths = pd.getString("uploadPaths");
if (StringUtil.isEmpty(uploadNames) || StringUtil.isEmpty(uploadPaths))
return str;
String filePath;
if (uploadPaths.indexOf(Constants.BASE.UPLOADTEMPDIR) > -1)// 临时文件
filePath = UploadUtil.getLinkURLByTempLinkURL(uploadPaths, uploadNames, codePath, getRequest()
.getServletContext());
else
filePath = uploadPaths;
if (StringUtil.isNotEmpty(filePath)) {
str[0] = uploadNames;
str[1] = filePath;
}
return str;
}
三、文件的路径问题
由于ajax文件上传的方式,一旦点击了文件上传的文件,就会保存到对应的文件保存路径中,但现实往往是需要点击表单中的保存按钮才能进行真正的保存。点击表单上的保存按钮时,将临时路径上的文件复制到真正规定需要上传的路径。所以,在文件上传的时候,我们需要将文件保存到一个临时的路径中,当表单未提交时可以通过删除临时的路径中的文件来修改表单提交的文件,而那些临时文件中没有删除的文件,给这个文件夹设置成超过一天自动删除文件
/**
* 删除旧附件
*
* @param oldStr
* @param newStr
*/
protected void delOldAttachments(String oldStr, String newStr) {
if (StringUtil.isEmpty(oldStr))
return;
String[] oldStrs = oldStr.split(",fh,");
for (int i = 0; i < oldStrs.length; i++) {
String Str = oldStrs[i];
if (StringUtil.isEmpty(Str))
continue;
String[] Strs = Str.split(",fu,");
if (StringUtil.isEmpty(Strs))
continue;
String linkPath = Strs[1];
if (StringUtil.isEmpty(linkPath))
continue;
if (StringUtil.isEmpty(newStr) || newStr.indexOf(linkPath) == -1)
FileUtil.deleteFileByLinkURL(linkPath, getRequest().getServletContext());
}
}
// 删除超时 设定为一天
public static void delOverTime(String floderPath, Integer days) {
if (days == null)
days = 1;
File file = new File(floderPath);
File subFiles[] = file.listFiles();
if (subFiles == null)
return;
Long toDayLong = DateUtil.getCurLong();
for (int i = 0; i < subFiles.length; i++) {
File subFile = subFiles[i];
if (subFile.isDirectory()) {
delOverTime(subFile.getPath(), days);
if (new File(subFile.getPath()).listFiles().length == 0)
deleteFile(subFile);
} else if (toDayLong - subFile.lastModified() >= (days * 86400000)) {
deleteFile(subFile);
}
}
}
基本的SpringMvc+ajax上传代码
@RequestMapping(value = "baseFileUpload")
public @ResponseBody
Object baseFileUpload(@RequestParam("upload") MultipartFile upload) {
Map<String, Object> map = new HashMap<String, Object>();
try {
if (upload == null) {
map.put("message", Constants.MESSAGE.UPLOAD.ERRFILE);
} else {
String uploadFileName = upload.getOriginalFilename();
String linkURL = UploadUtil.fileSaveTemp(getRequest(), upload, uploadFileName);// 先存入Temp文件夹
if (linkURL.startsWith("ERR")) {
map.put("message", linkURL);
} else {
map.put("fileName", uploadFileName);
map.put("filePath", linkURL);
map.put("message", Constants.MESSAGE.UPLOAD.OKFILE);
}
}
} catch (Exception e) {
map.put("message", "ERR:" + e.getMessage());
}
return AppUtil.returnObject(new PageData(), map);
}
还有一些细节之处就不一一列出来了,有不足之处欢迎指出