`

struts2 下载与上传 完美解决中文乱码

    博客分类:
  • S2SH
 
阅读更多

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的拦截器、请求编码以及在处理文件名时...

    如何解决struts2中烦人乱码

    在struts2中解决页面中出现的乱码问题,写在web.xml中

    struts2文件上传(解决中文乱码)

    Struts2是一个强大的Java Web...总之,解决Struts2中的中文乱码问题,关键在于配置正确的字符编码,并在文件上传和下载过程中处理好编码转换。通过以上步骤,你可以有效地在Struts2项目中实现对中文URL和文件名的支持。

    struts2文件下载(解决了中文乱码问题)

    在处理文件下载时,Struts2提供了一套完整的解决方案,包括处理中文文件名的乱码问题。在标题提到的场景中,开发者可能遇到了在使用Myeclipse 6.5集成开发环境,JDK1.6和Tomcat 6.0服务器环境下,通过Struts2进行...

    struts2中的批量上传与文件下载(解决中文乱码问题)

    本文将详细介绍如何在Struts2框架下实现批量上传与文件下载,并解决中文乱码问题。 一、Struts2文件上传 1. 配置Struts2文件上传支持: 在struts.xml配置文件中,我们需要添加`&lt;constant&gt;`元素来设置允许上传的...

    Struts2文件上传下载 中文乱码

    在Struts2框架中,文件上传和下载是常见...以上就是关于Struts2文件上传下载及处理中文乱码问题的详细解析。在实际开发中,需要根据具体项目环境和需求进行相应的调整和优化,确保文件操作的正确性和字符编码的一致性。

    Struts2中文乱码问题最终解决方案

    在Struts2的各个版本和不同过滤器设置下,GET方式提交的中文乱码问题仍然存在。一种可行的解决方案是在Tomcat服务器的配置文件`server.xml`中,修改`&lt;Connector&gt;`标签,添加`URIEncoding="UTF-8"`属性。这将强制...

    struts 2. 5.2解决中文乱码

    通过以上步骤,一般可以解决Struts 2.5.2框架下的中文乱码问题。但请注意,每个项目可能有不同的配置和需求,因此在实际应用中,还需要根据具体情况进行调试和调整。 在`myStruts`这个压缩包中,可能包含了示例代码...

    struts中文乱码问题解决详细步骤

    通过这些配置,大部分Struts中文乱码问题都能得到解决。但有时,问题可能源自于其他因素,比如静态资源(如CSS、JavaScript文件)的编码设置,或者是第三方库的编码处理不当。因此,排查问题时需全方位考虑,确保每...

    Struts2下载文件中文乱码处理

    ### Struts2下载文件中文乱码处理 在Web开发中,使用Struts2框架进行文件下载操作时,经常遇到的一个问题是文件名中的中文字符显示为乱码。这主要是因为浏览器和服务器之间的编码不一致所导致的。为了确保用户能够...

    struts2实现文件上传下载

    Struts2是一个强大的MVC(模型-视图-控制器)框架,广泛应用于Java ...以上就是使用Struts2框架实现文件上传下载的基本步骤和关键知识点。在实际开发中,可以根据项目需求进行调整和优化,确保功能的稳定性和安全性。

    struts2的中文乱码问题解决

    ### Struts2中文乱码问题解决方案 在使用Struts2框架进行Web开发的过程中,中文乱码问题是一个常见的挑战。这不仅影响用户体验,还可能导致数据不一致等问题。为了解决这一问题,我们需要理解其背后的原理,并采取...

    struts解决中文乱码问题

    本文将深入探讨如何解决Struts框架下的中文乱码问题。 首先,我们来看一个具体的实例。在登录验证的例子中,原本只要用户名(username)和密码(userpass)都是"123"就会返回成功页面。现在,我们将其升级,要求...

    struts2文件上传下载源代码

    这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件到服务器。在Struts2中,这通常通过表单实现,表单包含一个`&lt;input type="file"&gt;`...

    无中文乱码的Struts上传下载(任意文件上传)

    本教程将详细介绍如何在Struts中实现无中文乱码的文件上传与下载,并涵盖任意数量的文件上传。 首先,解决中文乱码问题的关键在于配置正确的字符编码。在Struts的配置文件`struts-config.xml`中,你需要为...

    Struts2乱码终极解决办法

    ### Struts2乱码终极解决办法 #### 一、引言 在开发基于Struts2框架的应用时,经常遇到的一个问题就是中文乱码。这不仅影响用户体验,还可能导致数据处理错误。本文将详细介绍如何彻底解决Struts2中的乱码问题,并...

    张孝祥09年Struts视频—04用struts获取上传文件名和解决中文乱码

    04用struts获取上传文件名和解决中文乱码

    Struts2.0解决中文乱码

    本文将深入探讨如何在Struts2.0中解决中文乱码问题,确保应用程序能够正确地处理和显示中文字符。 ### Struts2.0中文乱码问题分析 #### 1. 表单提交中文乱码 在Web应用中,表单是用户与服务器交互的主要方式之一...

    Struts上传,已经处理好乱码问题

    本篇文章将详细探讨如何在Struts中处理文件上传并解决乱码问题。 首先,我们需要了解Struts文件上传的基本原理。在Struts中,文件上传是通过`Commons FileUpload`库来实现的,它是Apache Commons项目的一部分,专门...

Global site tag (gtag.js) - Google Analytics