分享

网上找的一个比较详细的Struts2文件上传的解说但在实际中还要注意一些问题 - Bill的日志 - 网易博客

 燮羽 2010-10-31

网上找的一个比较详细的Struts2文件上传的解说但在实际中还要注意一些问题

网页相关 2010-04-04 14:26:34 阅读80 评论0   字号:大中小 订阅

1.如果用到了spring的方法注入的话一定不要忘了加 scope="prototype"这样每次访问action时,都会新建一个action,否则的话,会记录上传action留下的记录,出现意想不到的错误。

2.上传时出现的错误信息是放在request范围内的如果出现错误返回的input页面不是上传文件的form页面那么可以把错误信息提取出来

String error = this.getFieldErrors().get("file").toString();(file指struts2 file标签里 name的名字)

放在request,session。。范围内然后在input指定的页面显示错误信息。

3.文件大小和类型的限制是通过Struts2拦截器实现的你只需要在上传的action中做如下配置就可以

<param name="allowedTypes">
      application/octet-stream,application/x-zip-compressed,image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png,
      image/pjpeg
 </param>
 <param name="maximumSize">5242880</param>

但是有一点要注意Struts2默认文件上传最大为2M即便你设置了<param name="maximumSize">5242880</param>

当上传的文件大于2M时候也会出错的这时要设置另外一个常量<constant name="struts.multipart.maxSize" value="1000000000"/>

要让他的value设置的比你限定上传最大值要大一点。

以上是文件上传要注意的几点其实文件上传看起来比较难实际上比较简单,而文件下载就有点麻烦了遇到了很恼人的编码和乱码问题。

1.文件下载的action和普通的action查不多仅仅是该Action需要提供一个返回InputStream流的方法

public InputStream getInputStream() throws Exception
  
  Attachment attachment=attachmentManager.get(Long.valueOf(attachmentId));   
  File downFile=new File(attachment.getFilePath());   InputStream inStream = new FileInputStream(downFile);   
  return inStream;  
}

有一点要注意struts2提供了一个 ServletActionContext.getServletContext().getResourceAsStream(filePath);方 法根据路径返回输入流,但是这个方法和servletContext有关,当你把下载的文件放在项目的根目录中才可以否则会出错的,最保险的办法就是根据 文件路径找到这个文件然后在转化成输入流返回。

配置:

<action name="download" class="attachmentAction"
   method="downloadAttachment">
   <result name="success" type="stream">
    <param name="bufferSize">2048</param> //输入流缓冲的大小
    <param name="inputPath">inputStream</param>  //inputStream和getInputStream() 是对应的
   </result>
  </action>

2.编码,当文件名是中文时

String downFileName = new String(downFileName.getBytes("ISO8859-1"), "utf-8");

getResponse().setHeader(
    "Content-Disposition",
    "attachment; filename="
      + java.net.URLEncoder.encode(downFileName, "UTF-8"));

setHeader是设置http请求的头是MIME 协议的拓展可以实现以下功能

*希望某类或者某已知MIME 类型的文件(比如: .gif; .txt;*.htm)能够在访问时弹出"文件下载"对话框
*希望以原始文件名(上传时的文件名,例如:山东省政府1024号文件.doc)提供下载,但服务器上保存的地址却是其他文件名(如:12519810948091234_asdf.doc)
*希望某文件直接在浏览器上显示而不是弹出文件下载对话框 上面的代码实现了第一个功能。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多