解决Struts的DownloadAction的中文文件名的问题,关键就是要正常修改HTTP头啊。
举个例子:
package fox.math.kmust.action;
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DownloadAction;
import fox.math.kmust.dao.Homework;
import fox.math.kmust.dao.HomeworkDao;
import fox.math.kmust.dao.HomeworkDaoWithMySQL;
public class DownloadHomeworkAction extends DownloadAction {
@Override
protected StreamInfo getStreamInfo(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
if(request.getSession().getAttribute("id")==null){
return null;
}
DownloadHomeworkActionForm downloadHomeWorkActionForm = (DownloadHomeworkActionForm) form;
HomeworkDao dao = new HomeworkDaoWithMySQL();
long id = Long.parseLong(downloadHomeWorkActionForm.getId());
Homework homework = dao.find(id);
if(homework==null){
return null;
}
String realRoot = request.getSession().getServletContext().getRealPath(
"/作业/" + homework.getNumber());
String realPath = realRoot + "/" + homework.getFilename();
File file = new File(realPath);
response.setContentType("application/x-msdownload;charset=GBk"); //关键就在这里了 修改了编码头为gbk
response.setHeader("Content-Disposition", "attachment; filename="
+ new String(homework.getFilename().replace(" ", "").getBytes(
"gbk"), "iso-8859-1")); //并且在这里对文件名String进行了转码
final String contentType = "other";
return new FileStreamInfo(contentType, file);
}
}
//最后还要注意的是即使这样修改,我们的文件名还是必须没有空格,否则空格厚的内容将将被忽略。(暂时无法解决,有时间好好研究一下,有解决方案,待续)
评论0