`
mycream
  • 浏览: 55435 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Struts2 Ajax file upload 实现

阅读更多
Ajax file upload 文件上传有许多的插件支持,且都有相应的 PHP 服务端示范,可是在将代码应用到 Struts2 上时却总是不尽如意。网上也只找到一些不完全的解决方案。这里给出我的解决,因为已经有个样子了。在项目的后期再进行完善吧。

Struts2 上实现 Ajax file upload 的困难:

1. Struts2 对文件上传是通过 file upload 拦截器实现的,具体引入方法见这里。然而 File Upload 拦截器似乎对于 XHR 过来的文件上传请求无法响应,具体原因未去探究。也希望知道的人给个提示,谢谢。
2. 实现无页面刷新的文件上传通常是通过隐藏 iFrame 实现的。即在有文件上传的 form 中添加一个 target 属性,并指向一个隐藏 iFrame。这样可以实现页面无刷新,form 提交后的返回信息会填入到指定的 iframe 中。然而问题在于 iframe 只接收 contentType 为 HTML 和 XML 响应,对于其他类型的响应会以浏览器文件下载的形式提示下载。


为解决以上问题,思路如下:

1. 先编写正常的文件上传 form,而不用 XHR。并添加一个隐藏 iframe。将 form 的 target 指向隐藏 iframe。
2. 配置 action 的返回值类型为 text/html,用  包装 JSON 数据。在接收数据时再对其进行解析转换为 JSON

具体实现:

使用到的工具包:
jquery.form.js
Struts 2 的 JSON 插件

在实现文件上传的过程中无意间看到 jquery.form.js 上有对文件上传中遇到的问题2进行了描述,也看到了它给出的解决方案,于是决定用它来简化开发。而 Struts2 的 JSON 插件本来是为了实现 JSON 传输的,发现它可以为 JSON 数据自动添加包装,且描述中明确表明是为了实现文件上传的。呵呵,有意思的巧合。

编写 JSP:
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.form.js"></script>    

<s:form action="doUpload" method="post" enctype="multipart/form-data">
    <s:file name="upload" label="File"/>
    <s:submit/>
</s:form>

<script type="text/javascript">
$('form').ajaxForm({
    dataType: 'json',
    success: function(data) { /* do something you want */}
});
</script>


编写 Action:
注意
getter 和 setter 的设置问题。因为 JSON 插件会将所有的 getter 方法转换为 JSON 输出,所以应尽量避免不必要的 getter 方法的存在。尤其是类似 getFile():InputStream 的方法,因为这样会把整个文件变为一堆乱码输出到页面,页面运行速度极慢。
package cream;

import java.io.File;
import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {
   private File file;
   private String contentType;
   private String filename;

   private String message;

   public void setUpload(File file) {
      this.file = file;
   }

   public void setUploadContentType(String contentType) {
      this.contentType = contentType;
   }

   public void setUploadFileName(String filename) {
      this.filename = filename;
   }

   public String execute() {
      //...
      return SUCCESS;
   }

   // getter with necessary
   public String getMessage() {
       return this.message;
    }
}


配置 XML:
<action name="doUpload" class="cream.UploadAction">
    <result type="json">
        <param name="wrapPrefix"><![CDATA[<textarea>]]></param>
        <param name="wrapSuffix"><![CDATA[</textarea>]]></param>
        <param name="contentType">text/html</param>
    </result>
</action>

这里对于结果进行了特殊处理,将结果的 contentType 设置成了 "text/html" 以便 iframe 可以正常接收。而将 JSON 封装在了  中,便于 JS 在前端进行处理。

这样对于 Struts2 的文件上传就改造完成了。现在可以实现无刷新页面上传啦
分享到:
评论

相关推荐

    Jquery Struts2 Upload File

    **jQuery Struts2 Upload File** 是一个用于在Web应用程序中实现文件上传功能的组合技术,主要结合了jQuery库和Struts2框架。这篇文章将深入探讨这个主题,介绍如何利用这两者来实现高效的文件上传功能。 首先,...

    struts2 ajax上传图片以及提交form表单的值

    在本场景中,我们将探讨如何在Struts2中实现AJAX上传图片并同时提交表单数据。 **一、Struts2文件上传** 在Struts2中,文件上传主要依赖于`org.apache.struts2.interceptor.FileUploadInterceptor`拦截器。首先,...

    Struts2(ajax提交)上传

    在Struts2框架中,我们可以结合Ajax实现文件上传功能,从而提高用户界面的响应速度和友好性。 首先,我们需要了解Struts2中处理文件上传的基础知识。Struts2提供了`struts2-convention-plugin`和`struts2-core`等...

    ajaxFileUpload_Struts2_json

    同时,通过设置Action的返回类型为`json`,我们可以使Struts2以JSON格式返回响应数据,这对于前端AJAX调用非常有用,因为它可以直接解析JSON数据并更新页面内容。 在前端,我们需要创建一个HTML表单,包含一个或多...

    jquery+struts2+upload

    总的来说,"jquery+struts2+upload"的组合是一个经典的Web开发实践,它展示了如何利用jQuery进行前端交互,通过Struts2处理后端业务,并实现文件上传这一常见的功能需求。通过理解和实践这个例子,开发者可以更好地...

    JQuery_uploadify_struts2_jsp__ajax多文件上传

    标题中的"JQuery_uploadify_struts2_jsp__ajax多文件上传"涉及到的是一个使用jQuery、uploadify插件、Struts2和JSP技术实现的AJAX多文件上传功能。这个功能允许用户在不刷新页面的情况下,上传多个文件到服务器。 ...

    Struts2实现文件上传功能

    以上就是使用Struts2实现文件上传的基本步骤。需要注意的是,实际项目中还需要考虑文件的安全性,比如防止恶意文件上传、文件覆盖、文件大小控制等。此外,随着技术的发展,现代的前端框架如React、Vue等通常会与...

    struts+ajax上传进度条

    Struts和Ajax结合实现上传进度条是一个常见的技术需求,尤其在开发交互性强的Web应用时。Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,而Ajax(Asynchronous JavaScript and XML)则是一种...

    struts1.2下实现文件上传进度条

    - **整合Struts与Ajax Upload**: - 修改`struts-config.xml`,配置Action映射以支持文件上传操作。 - 实现文件上传逻辑,处理上传进度数据。 - 设置监听器以捕获上传事件,更新客户端进度条。 #### 四、总结 ...

    Struts2实现文件的上传下载

    在本项目中,我们关注的是如何使用Struts2来实现实时的文件交互操作,即文件的上传与下载。 文件上传在Web应用中很常见,例如用户提交表单时可能需要附加文件,如简历、图片或文档等。Struts2提供了一套完整的机制...

    使用struts 2 和ajaxFileUpload组件实现图片上传预览(完整版)

    4. **创建Action类**:在Java代码中,创建`UploadAction`类,继承自Struts 2的ActionSupport类,实现文件上传的方法,如`upload()`。在这个方法中,可以使用`ServletFileUpload`类来处理上传的文件。 5. **前端页面...

    Struts2文件批量上传

    要实现Struts2的文件批量上传,首先需要在`struts.xml`配置文件中添加相应的action配置,指定接收文件的Action类。Action类中需要定义一个或多个类型为`java.io.File`的字段,以及对应的`String`类型的字段来保存...

    ajax_struts2進度條

    在“ajax_struts2進度條”这个主题中,我们主要探讨如何在Struts2框架中利用Ajax实现文件上传时的进度条功能,提供用户友好的体验。 首先,让我们理解Ajax的核心概念。Ajax是一种在不刷新整个页面的情况下,通过...

    struts2_uploadify带进度条的多文件上传下载

    Struts2 Uploadify是一个在Java Web开发中常用的插件,它结合了Struts2框架和Uploadify jQuery插件,能够实现文件的多选、上传进度显示以及后台处理等功能。这个项目示例提供了一个完整的解决方案,使得用户在上传多...

    Struts2 JQuery同步上传图片

    在本例中,我们将探讨如何结合Struts2和jQuery实现图片的同步上传功能。 首先,让我们分析`upload.jsp`页面。这个页面是用户与应用交互的界面,它包含了一个Struts2的表单(`&lt;s:form&gt;`),用于文件上传。表单的属性...

    struts2+jquery多文件上传显示进度条,可直接运行(非常强大)

    这个项目的核心是利用Struts2的Action支持和jQuery的AJAX功能,以及一个用于展示进度条的插件,如jQuery UI或blueimp的File Upload插件。 首先,Struts2是基于MVC(模型-视图-控制器)架构的Java Web框架,它简化了...

    struts2+extjs中File的upload&download;&delete;例子及说明

    ### Struts2与ExtJS集成实现文件的上传、下载与删除功能详解 #### 一、项目背景与技术栈概述 本案例旨在通过Struts2框架与ExtJS前端库的结合来实现文件的批量上传、下载以及删除功能。适用于对Struts2与ExtJS有...

    Struts2实现压缩文件上传

    在本文中,我们将深入探讨如何使用Struts2来实现压缩文件的上传功能,并将其保存到Tomcat服务器上的特定目录。 首先,我们需要在Struts2项目中引入必要的依赖。这通常包括Struts2的核心库、文件上传插件和其他可能...

    Uploadify结合Struts2上传demo

    本教程将围绕"Uploadify结合Struts2上传demo"这一主题,详细介绍如何在Struts2框架下集成Uploadify实现文件上传功能。 首先,我们需要在项目中引入Uploadify的相关资源。这通常包括JavaScript库(uploadify.js)和...

    struts2+extjs3 单/多文件上传

    本文将深入探讨如何使用Struts2和ExtJS3实现单文件和多文件的上传功能。 首先,我们要理解文件上传的基本流程。在Web应用中,用户通过浏览器选择本地文件,然后这些文件的数据被封装到HTTP请求中发送到服务器。...

Global site tag (gtag.js) - Google Analytics