|
Struts2 对 所有 enctype="multipart/form-data"(上传文件用的表单数据类型) 的表单的request进行了封装。打包成MultiPartRequestWrapper 。这就导致拿不到原本的request了。
有个简单的方法是将web.xml中:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
修改为:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
不过,又会有其他的问题产生,比如,你的网页经常性用到 struts-tag 标签,那么可能就会报 404 或者 500 的错误,因为普通jsp网页在没有调用action时,使用struts标签会访问不到元素。
又一个纠结(悲剧,项目做到后面才去玩KE,所以,还是不改动url了)~~ 自己写action处理上传吧,也不怎么奏效。
查了查资料,其实,这是struts带给我们的方便。在不改动<url-pattern>/*</ url-pattern>的情况下重写upload_json.jsp。
修改后的代码:(注:注意路径问题)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper"%>
<%@page import="java.util.concurrent.locks.*" %>
<%@page import="java.io.*" %>
<%@ page import="org.json.simple.*" %>
<%
//Struts2 请求 包装过滤器
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper)request;
//获得上传的文件名
String fileName = wrapper.getFileNames("imgFile")[0];
//获得未见过滤器
File file = wrapper.getFiles("imgFile")[0];
//----------重新构建上传文件名---------
final Lock lock = new ReentrantLock();
String newName = null;
lock.lock();
try{
//加锁为防止文件名重复
newName = System.currentTimeMillis()
+fileName.substring(fileName.lastIndexOf("."),
fileName.length());
}finally{
lock.unlock();
}
//------锁结束---------
//获取文件输出流
FileOutputStream fos = new FileOutputStream(request.getSession()
.getServletContext().getRealPath("/")
+"team/" + newName);
//设置 KE 中的图片文件地址
String newFileName = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ request.getContextPath() + "/team/" + newName;
byte[] buffer = new byte[1024];
//获取内存中当前文件输入流
InputStream in = new FileInputStream(file);
try{
int num = 0;
while((num = in.read(buffer)) > 0){
fos.write(buffer,0,num);
}
}catch(Exception e){
e.printStackTrace(System.err);
}finally{
in.close();
fos.close();
}
//发送给 KE
JSONObject obj = new JSONObject();
obj.put("error", 0);
obj.put("url", newFileName);
out.println(obj.toJSONString());
%> |
|