现象,KindEditor单张图片上传 banner.jpg 没问题。
其他人,上传就是提示 服务器报错。
最终,自己换了个浏览器,复现了。
最后得出的结论是:
banner.jpg 没问题。
500qiang.png就不行。
png后缀的,需要上传到临时目录,临时目录不存在,Windows和Linux都会报错的。
最开始还以为是,Linux没权限。
DiskFileItemFactory factory = new DiskFileItemFactory();
// 临时文件目录,linux有/tmp目录,windows需要在当前磁盘下D盘创建“/tmp”目录
// 坑人的地方,banner.jpg不进入/tmp目录,当然也就不需要创建。而500qiang.png就进入到/tmp目录,必须先创建目录
factory.setRepository(new File(UPLOAD_TMP_DIR));
这段代码,就算设置了临时目录,PNG图片才会进去(upload_6a949562_2397_4220_b449_54022e43c596_00000003.tmp),jpg不会进去,不需要设置临时目录。
具体原因不详,暂时懒得去深究这个技术细节了。
今后,还是手动设置目录比较稳妥。
@Controller
public class KindeditorController extends BaseController {
// 上传文件的临时目录
private static final String UPLOAD_TMP_DIR = "/tmp";
@RequestMapping("/kindeditor/uploadJson")
public void kindeditorUploadJson(HttpServletRequest request, HttpServletResponse response)
throws FileUploadException {
response.setContentType("text/html;charset=UTF-8");
long maxSize = GlobalConfig.Image.maxSize;
// 定义允许上传的文件扩展名
HashMap<String, String> extMap = new HashMap<String, String>();
extMap.put("image", "gif,jpg,jpeg,png,bmp");
extMap.put("flash", "swf,flv");
extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
String dirName = request.getParameter("dir");
if (dirName == null) {
dirName = "image";
}
if (!ServletFileUpload.isMultipartContent(request)) {
super.returnJsonString(response, ("请选择文件。"));
return;
}
DiskFileItemFactory factory = new DiskFileItemFactory();
// 临时文件目录,linux有/tmp目录,windows需要在当前磁盘下D盘创建“/tmp”目录
// 坑人的地方,banner.jpg不进入/tmp目录,当然也就不需要创建。而500qiang.png就进入到/tmp目录,必须先创建目录
factory.setRepository(new File(UPLOAD_TMP_DIR));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
String finalFileName = "";
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
String fileName = item.getName();
long fileSize = item.getSize();
if (!item.isFormField()) {
// 检查文件大小
if (fileSize > maxSize) {
super.returnJsonString(response, getError(GlobalConfig.Image.maxSizeTip));
return;
}
// 检查扩展名
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if (!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)) {
super.returnJsonString(response, getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。"));
return;
}
try {
String ossDomain = BasePropertyConfigurer.getContextProperty("ossDomain");
finalFileName = ossDomain + "/"
+ ImageUploaderUtil.handleOssFileList(item.getName(), item.getInputStream());
} catch (Exception e) {
super.returnJsonString(response, getError("上传文件失败。"));
return;
}
JSONObject obj = new JSONObject();
obj.put("error", 0);
obj.put("url", finalFileName);
super.returnJsonObject(response, obj);
}
}
}