struts2.5.12文件上传使用的MultiPartRequestWrapper类与UploadedFile接口

l低语 2017-11-06 04:44:21
我用到的kindeditor编辑器有文件上传,之前用的struts2.3.32,这是原代码

boolean flag = true;
//struts2 请求 包装过滤器
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper)request;
//从请求包装获取文件域的名字
Enumeration fileParameterNames = wrapper.getFileParameterNames();
//当文件域名字不为null,且含有多个参数的时候进入循环
while(fileParameterNames != null && fileParameterNames.hasMoreElements() && flag){
//得到下一个文件域的name属性值
String inputName = (String) fileParameterNames.nextElement();
//得到这个请求中的mime文件类型数组
String[] contentType = wrapper.getContentTypes(inputName);
if(contentType != null && contentType.length != 0){
String[] fileNames = wrapper.getFileNames(inputName);
if(fileNames != null && fileNames.length != 0){
File[]files = wrapper.getFiles(inputName);
for(int i=0;i<files.length;i++){
String fileName=fileNames[i];
//文件扩展名
String fileExt = fileName.substring(fileName.lastIndexOf(".")+1).toLowerCase();
File file = files[i];
//检查文件大小
if(file.length() > maxSize){
out.println(getError("上传文件大小超过限制。"));
return;
}
//检查扩展名
if(!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)){
out.println(getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。"));
return;
}

SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
try{
File uploadedFile = new File(savePath, newFileName);
if(!uploadedFile.isFile()){
uploadedFile.createNewFile();
}
byte[] buffer = new byte[1024];
FileOutputStream fos = new FileOutputStream(uploadedFile);
InputStream in = new FileInputStream(file);
int num = 0;
while((num = in.read(buffer))>0){
fos.write(buffer, 0, num);
}
in.close();
fos.close();
}catch(Exception e){
out.println(getError("上传文件失败。"));
return;
}

JSONObject obj = new JSONObject();
obj.put("error", 0);
obj.put("url", saveUrl + newFileName);
out.println(obj.toJSONString());
flag = false;
}

}
}
}

后来对struts进行升级,从struts2.3.32升级到struts2.5.12,结果出现了以下问题



错误原因是struts升级后,MultiPartRequestWrapper 的getFiles方法返回的对象从java.io.File变成了org.apache.struts2.dispatcher.multipart.UploadedFile,于是我将代码进行修改,引入UploadedFile。



在获取文件输入流的时候,进行强转



问题就在这里。从编译上看是通过了,但是运行后上传文件时,出现了异常,说是StrutsUploadedFile不能转化成File



于是我就去找UploadedFile的源码,但是并没有得到有用的信息



UploadedFile并非是File的子类,所以不能强转。但是如此一来就无法获取文件输入流,不能上传文件。
我再把目光转到异常信息上,突然之间看到了StrutsUploadedFile,然后灵机一动,或许这个UploadedFile的实现类能获取到文件输入流。然后找到StrutsUploadedFile的源码



getContent方法就可以返回File对象,从而获取文件输入流,进行文件上传。
最后将出现类型转化异常的地方进行修改,然后成功上传





...全文
1642 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
l低语 2017-11-06
  • 打赏
  • 举报
回复
源码通过maven获得。

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧