2013.08.16 更新
1、struts配置
<package name="download" namespace="/down" extends="struts-default"> <action name="*_*" method="{2}" class="com.lims.core.action.{1}Action"> <result name="down" type="stream"> <param name="contentType">application/octet-stream;charset=ISO8859-1</param> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename="${downloadFileName}"</param> <param name="bufferSize">10240</param> </result> </action> </package>
2、Action
* 项目名称:LIMS_v1
* 类名称:GlobalDownloadAction
* 类描述:
* 创建人:zangzh
* 创建时间:2013-8-16 下午06:48:08
* 修改人:zangzh
* 修改时间:2013-8-16 下午06:48:08
* 修改备注:
* @version
*/
public class GlobalDownloadAction extends BaseStruts2Action implements Preparable,ModelDriven{
private static final long serialVersionUID = 2591642527793106588L;
public Object getModel() {return null;}
private String fileName ; //下载文件名
private InputStream inputStream ; // 下载文件使用流
private String downloadFileName;
/**
*
*/
public String execute() {
String realpath = ServletActionContext.getServletContext().getRealPath("/");
try {
//设置文件名
String postfix = this.fileName.substring(this.fileName.length()-4);
String fn = URLDecoder.decode(this.downloadFileName, "UTF-8")+postfix;
fn = new String(fn.getBytes(),"ISO8859-1");
//文件
File file = new File(realpath+this.fileName);
if(!file.exists()) {
file = new File(realpath+"upload/notice/nofile.txt");
fn = new String("未到找文件.txt".getBytes(),"ISO8859-1");
}
this.setDownloadFileName(fn);
this.setInputStream(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
return "down";
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public InputStream getInputStream(){
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String getDownloadFileName() {
return downloadFileName;
}
public void setDownloadFileName(String downloadFileName) {
this.downloadFileName = downloadFileName;
}
}
3、页面 js 请求
<script type="text/javascript"> function down(fileName,downloadFileName) { var name = encodeURIComponent(encodeURIComponent(downloadFileName)); window.open("<%=basePath%>down/GlobalDownload_execute.do?fileName="+fileName+"&downloadFileName="+name,"_blank"); } </script>
4、这种方式写了通用的下载,但浏览器点击下载后,在弹出窗口中没有点保存,而点击的取消刚会出以下BUG, 未能解决:
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358) at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:352) at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381) at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370) at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
-------------------这是早期的写法- 比较乱,建议采用上面的-----------------------------------
一、下载
1 、配置文件
<!-- 确认 候选人基本信息 --> < action name = "hxrBaseInfo_*" class = "hxrBaseInfoAction" method = "{1}" > < result name = "down" type = "stream" > < param name = "contentType" > application/octet -stream;charset =ISO8859-1 </ param > < param name = "inputName" > inputStream </ param > <!-- 使用经过转码的文件名作为下载文件名, downloadFileName 属性 对应 action 类中的方法 getDownloadFileName() --> < param name = "contentDisposition" > attachment;filename="${downloadFileName}" </ param > < param name = "bufferSize" > 5120 </ param > </ result > </ action > |
2 、 action
public class HxrBaseInfoAction ……………… // 导出下载使用 private String fileName ; // 下载文件名 private InputStream inputStream ; // 下载文件使用流 /** * 下载方法 * @return * @throws Exception */ public String exportZip() throws Exception { return "down" ; //1 、调用 getInputStream() 在 Stream 中给文件 //2 、调用 getDownloadFileName 取得下载名 解决了中文乱码 // 如果是前台传过来的中文乱码,还要在 } public InputStream getInputStream() { try { this .setFileName( 可以给定“中文名” ); this . inputStream = new FileInputStream( this . fileName ); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return this . inputStream ; }
public void setInputStream(InputStream inputStream) ……………… /** * 指定下载文件名称 解决了中文乱码 可见配置文件中对应 ${downloadFileName} * @return */ public String getDownloadFileName(){ String fn = "" ; try { String temp = this .getFileName(). ……………… ; fn = new String(temp.getBytes(), "ISO8859-1" ); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return fn; } 解决传参是“中文”时的乱码。为里对应下面 js 请求下载 public void setFileName(String fileName) { try { this . fileName = URLDecoder.decode (fileName, "utf-8" ); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Js get 传值 — 》乱码解决方法 var url = $.url.encode(" 候选人授权书 - 太和鼎信 ") ; // 解决中文件名乱码 window.open("downloadOrUpload_down.action?fileName="+$.url.encode(url)+".pdf","_self"); |
二、上传
1、action
//文件上传
private File uploadFile;//得到上传的文件
private String uploadFileContentType;//得到文件的类型
private String uploadFileFileName;//得到文件的名称
getter setter 省略
/***
* 接收上传文件
* @return
* @throws Exception
*/
public String upload() throws Exception {
try {
//String realpath = ServletActionContext.getServletContext().getRealPath("/downloadFiles/upload");
String realpath = (String) Constant.getValue("hxr.baseInfo.upFiles");
File file = new File(realpath);
if(!file.exists()) file.mkdirs();
//取得扩展名
String fileExtName = uploadFileFileName.substring(uploadFileFileName.indexOf(".")+1);
//生成新的文件名
String newFileName = UUID.randomUUID().toString()+"."+fileExtName;
FileUtils.copyFile(uploadFile, new File(file, newFileName));
//生成缩略图 支持生成//bmp,jpg,rar,doc,pdf,zip,tif
String filterStr = "bmp,jpg,tif";
String littleImgRelePath = ServletActionContext.getServletContext().getRealPath("/downloadFiles/littleImg");
String littleImgPath = ""; //小图路径
if(filterStr.indexOf(fileExtName)>-1) {
// TODO 调用 高立收 方法生成 小图
ScaleImage.saveImageAsJpg(realpath+newFileName, littleImgRelePath+"/"+newFileName, 440, 400);
//ScaleImage.saveImageAsJpg(realpath+"lilteImage/",);
littleImgPath = "downloadFiles/littleImg/"+ newFileName;
}
// session中注册 文件
Map<String, Boolean> fileMap = (Map<String, Boolean>) this.getRequest().getSession().getAttribute("fliesMap");
fileMap.put(realpath+newFileName, false); //原图注册
fileMap.put(littleImgRelePath+"/"+newFileName, false); //缩略图注册
if(!"".equals(littleImgPath)) fileMap.put(littleImgPath, false);
this.returnString("{success:true,filePath:'"+realpath+newFileName+"',fileName:'"+uploadFileFileName+"',littleImgPath:'"+littleImgPath+"'}", "UTF-8");
} catch (Exception e) {
e.printStackTrace();
this.returnString("{success:false}", "UTF-8");
}
return null;
}
相关推荐
通过上述实践和调试,我们已经成功解决了Struts2框架下中文文件名上传和下载的乱码问题。在遇到类似问题时,可以按照这些步骤进行排查和修复。记住,关键在于正确配置Struts2的拦截器、请求编码以及在处理文件名时...
在struts2中解决页面中出现的乱码问题,写在web.xml中
Struts2是一个强大的Java Web...总之,解决Struts2中的中文乱码问题,关键在于配置正确的字符编码,并在文件上传和下载过程中处理好编码转换。通过以上步骤,你可以有效地在Struts2项目中实现对中文URL和文件名的支持。
在处理文件下载时,Struts2提供了一套完整的解决方案,包括处理中文文件名的乱码问题。在标题提到的场景中,开发者可能遇到了在使用Myeclipse 6.5集成开发环境,JDK1.6和Tomcat 6.0服务器环境下,通过Struts2进行...
本文将详细介绍如何在Struts2框架下实现批量上传与文件下载,并解决中文乱码问题。 一、Struts2文件上传 1. 配置Struts2文件上传支持: 在struts.xml配置文件中,我们需要添加`<constant>`元素来设置允许上传的...
在Struts2框架中,文件上传和下载是常见...以上就是关于Struts2文件上传下载及处理中文乱码问题的详细解析。在实际开发中,需要根据具体项目环境和需求进行相应的调整和优化,确保文件操作的正确性和字符编码的一致性。
在Struts2的各个版本和不同过滤器设置下,GET方式提交的中文乱码问题仍然存在。一种可行的解决方案是在Tomcat服务器的配置文件`server.xml`中,修改`<Connector>`标签,添加`URIEncoding="UTF-8"`属性。这将强制...
通过以上步骤,一般可以解决Struts 2.5.2框架下的中文乱码问题。但请注意,每个项目可能有不同的配置和需求,因此在实际应用中,还需要根据具体情况进行调试和调整。 在`myStruts`这个压缩包中,可能包含了示例代码...
通过这些配置,大部分Struts中文乱码问题都能得到解决。但有时,问题可能源自于其他因素,比如静态资源(如CSS、JavaScript文件)的编码设置,或者是第三方库的编码处理不当。因此,排查问题时需全方位考虑,确保每...
### Struts2下载文件中文乱码处理 在Web开发中,使用Struts2框架进行文件下载操作时,经常遇到的一个问题是文件名中的中文字符显示为乱码。这主要是因为浏览器和服务器之间的编码不一致所导致的。为了确保用户能够...
Struts2是一个强大的MVC(模型-视图-控制器)框架,广泛应用于Java ...以上就是使用Struts2框架实现文件上传下载的基本步骤和关键知识点。在实际开发中,可以根据项目需求进行调整和优化,确保功能的稳定性和安全性。
### Struts2中文乱码问题解决方案 在使用Struts2框架进行Web开发的过程中,中文乱码问题是一个常见的挑战。这不仅影响用户体验,还可能导致数据不一致等问题。为了解决这一问题,我们需要理解其背后的原理,并采取...
本文将深入探讨如何解决Struts框架下的中文乱码问题。 首先,我们来看一个具体的实例。在登录验证的例子中,原本只要用户名(username)和密码(userpass)都是"123"就会返回成功页面。现在,我们将其升级,要求...
这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件到服务器。在Struts2中,这通常通过表单实现,表单包含一个`<input type="file">`...
本教程将详细介绍如何在Struts中实现无中文乱码的文件上传与下载,并涵盖任意数量的文件上传。 首先,解决中文乱码问题的关键在于配置正确的字符编码。在Struts的配置文件`struts-config.xml`中,你需要为...
### Struts2乱码终极解决办法 #### 一、引言 在开发基于Struts2框架的应用时,经常遇到的一个问题就是中文乱码。这不仅影响用户体验,还可能导致数据处理错误。本文将详细介绍如何彻底解决Struts2中的乱码问题,并...
04用struts获取上传文件名和解决中文乱码
本文将深入探讨如何在Struts2.0中解决中文乱码问题,确保应用程序能够正确地处理和显示中文字符。 ### Struts2.0中文乱码问题分析 #### 1. 表单提交中文乱码 在Web应用中,表单是用户与服务器交互的主要方式之一...
本篇文章将详细探讨如何在Struts中处理文件上传并解决乱码问题。 首先,我们需要了解Struts文件上传的基本原理。在Struts中,文件上传是通过`Commons FileUpload`库来实现的,它是Apache Commons项目的一部分,专门...