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** 是一个用于在Web应用程序中实现文件上传功能的组合技术,主要结合了jQuery库和Struts2框架。这篇文章将深入探讨这个主题,介绍如何利用这两者来实现高效的文件上传功能。 首先,...
在本场景中,我们将探讨如何在Struts2中实现AJAX上传图片并同时提交表单数据。 **一、Struts2文件上传** 在Struts2中,文件上传主要依赖于`org.apache.struts2.interceptor.FileUploadInterceptor`拦截器。首先,...
在Struts2框架中,我们可以结合Ajax实现文件上传功能,从而提高用户界面的响应速度和友好性。 首先,我们需要了解Struts2中处理文件上传的基础知识。Struts2提供了`struts2-convention-plugin`和`struts2-core`等...
同时,通过设置Action的返回类型为`json`,我们可以使Struts2以JSON格式返回响应数据,这对于前端AJAX调用非常有用,因为它可以直接解析JSON数据并更新页面内容。 在前端,我们需要创建一个HTML表单,包含一个或多...
总的来说,"jquery+struts2+upload"的组合是一个经典的Web开发实践,它展示了如何利用jQuery进行前端交互,通过Struts2处理后端业务,并实现文件上传这一常见的功能需求。通过理解和实践这个例子,开发者可以更好地...
标题中的"JQuery_uploadify_struts2_jsp__ajax多文件上传"涉及到的是一个使用jQuery、uploadify插件、Struts2和JSP技术实现的AJAX多文件上传功能。这个功能允许用户在不刷新页面的情况下,上传多个文件到服务器。 ...
以上就是使用Struts2实现文件上传的基本步骤。需要注意的是,实际项目中还需要考虑文件的安全性,比如防止恶意文件上传、文件覆盖、文件大小控制等。此外,随着技术的发展,现代的前端框架如React、Vue等通常会与...
Struts和Ajax结合实现上传进度条是一个常见的技术需求,尤其在开发交互性强的Web应用时。Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,而Ajax(Asynchronous JavaScript and XML)则是一种...
- **整合Struts与Ajax Upload**: - 修改`struts-config.xml`,配置Action映射以支持文件上传操作。 - 实现文件上传逻辑,处理上传进度数据。 - 设置监听器以捕获上传事件,更新客户端进度条。 #### 四、总结 ...
在本项目中,我们关注的是如何使用Struts2来实现实时的文件交互操作,即文件的上传与下载。 文件上传在Web应用中很常见,例如用户提交表单时可能需要附加文件,如简历、图片或文档等。Struts2提供了一套完整的机制...
4. **创建Action类**:在Java代码中,创建`UploadAction`类,继承自Struts 2的ActionSupport类,实现文件上传的方法,如`upload()`。在这个方法中,可以使用`ServletFileUpload`类来处理上传的文件。 5. **前端页面...
要实现Struts2的文件批量上传,首先需要在`struts.xml`配置文件中添加相应的action配置,指定接收文件的Action类。Action类中需要定义一个或多个类型为`java.io.File`的字段,以及对应的`String`类型的字段来保存...
在“ajax_struts2進度條”这个主题中,我们主要探讨如何在Struts2框架中利用Ajax实现文件上传时的进度条功能,提供用户友好的体验。 首先,让我们理解Ajax的核心概念。Ajax是一种在不刷新整个页面的情况下,通过...
Struts2 Uploadify是一个在Java Web开发中常用的插件,它结合了Struts2框架和Uploadify jQuery插件,能够实现文件的多选、上传进度显示以及后台处理等功能。这个项目示例提供了一个完整的解决方案,使得用户在上传多...
在本例中,我们将探讨如何结合Struts2和jQuery实现图片的同步上传功能。 首先,让我们分析`upload.jsp`页面。这个页面是用户与应用交互的界面,它包含了一个Struts2的表单(`<s:form>`),用于文件上传。表单的属性...
这个项目的核心是利用Struts2的Action支持和jQuery的AJAX功能,以及一个用于展示进度条的插件,如jQuery UI或blueimp的File Upload插件。 首先,Struts2是基于MVC(模型-视图-控制器)架构的Java Web框架,它简化了...
### Struts2与ExtJS集成实现文件的上传、下载与删除功能详解 #### 一、项目背景与技术栈概述 本案例旨在通过Struts2框架与ExtJS前端库的结合来实现文件的批量上传、下载以及删除功能。适用于对Struts2与ExtJS有...
在本文中,我们将深入探讨如何使用Struts2来实现压缩文件的上传功能,并将其保存到Tomcat服务器上的特定目录。 首先,我们需要在Struts2项目中引入必要的依赖。这通常包括Struts2的核心库、文件上传插件和其他可能...
本教程将围绕"Uploadify结合Struts2上传demo"这一主题,详细介绍如何在Struts2框架下集成Uploadify实现文件上传功能。 首先,我们需要在项目中引入Uploadify的相关资源。这通常包括JavaScript库(uploadify.js)和...
本文将深入探讨如何使用Struts2和ExtJS3实现单文件和多文件的上传功能。 首先,我们要理解文件上传的基本流程。在Web应用中,用户通过浏览器选择本地文件,然后这些文件的数据被封装到HTTP请求中发送到服务器。...