`
aokunsang
  • 浏览: 816037 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jquery 插件ajaxfileupload与struts2结合 实现异步上传图片

阅读更多

       因为项目需要,想实现一个异步上传图片的功能。当然这时struts2自带的fileupload拦截器不能用了。

网上搜了下,基本都是用插件来实现了,我就随便选择了一个简单的插件-ajaxfileupload来实现、

 

先构架出struts2的框架就不说了,无非那5个常用的jar包导入而已。因为是jquery的插件,因此需要添加jquery库文件以及核心文件ajaxfileupload.js,下面附件中会有这个js文件。写一个相当简单的上传类:

package com.aokunsang.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport {

	private File file;
	private String fileFileContentType;
	private String fileFileName;
	
	public void upload() throws Exception{
		String message = "";
		//这里的返回类型设置是重点。否则会报错,必须设置成text/html;如果设置成application/json  IE下会有问题,chrome没问题的。
		ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
		ServletActionContext.getResponse().setCharacterEncoding("utf-8");
		if(fileFileName.endsWith(".exe")){
			message = "不允许上传此类文件!";
		}else if(!file.exists()){
			message = "此文件不存在!";
		}else {
			FileInputStream fis = new FileInputStream(file);
			FileOutputStream fos = new FileOutputStream(new File("F://aa.jpg"));
			byte bt[] = new byte[500];
			while(fis.read(bt)>0){
				fos.write(bt);
			}
			fis.close();
			fos.flush();
			fos.close();
			message = "文件上传成功!";
		}
		ServletActionContext.getResponse().getWriter().write("{msg:\""+message+"\"}");
		ServletActionContext.getResponse().getWriter().flush();
		ServletActionContext.getResponse().getWriter().close();
	}

	setter和getter。。。。

 

 

 

 

 

<package namespace="/" name="root" extends="struts-default">
		<action name="fileUpload" class="com.aokunsang.action.FileUploadAction" method="upload">
		</action>
	</package>

 

这里大家可能注意到:我的action中的方法没有返回值,因为我用ServletActionContext.getResponse().getWriter().write()直接返回给jquery回调函数需要的参数,所以没用struts2

的必须返回值,当然你也可以有返回值none等。

 

重点解析:

   1、网上有说需要用struts-json.jar,我观察发现他们使用这个jar文件无非是想返回jquery的回调函数一个json字符串【切记是个字符串】而已。因此我使用:ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");

   2、注意返回字符串的格式:必须是一个json格式的字符串,并且为"{msg:''}"这样类型。

    3、当使用springMVC3.x时候,会使用@ResponseBody返回个json字符串,contentType为application/json类型,经测试,发现chrome正常;IE下会有问题(IE下得到的json字符串是:<PRE>json字符串</PRE>【带有PRE标签,不知道啥玩意原因】)。解决方法:只要把contentType设置成text/html就行。给个例子:

 

@RequestMapping(value="uploadImage",method=RequestMethod.POST)
	public void uploadImage(HttpServletResponse response,MultipartFile imgFile,String imgFlag,String companyid) throws IOException{
	
	......

	Map<String,String> resultParam = new HashMap<String,String>();
	resultParam.put("msg", msg);
	resultParam.put("error", error);
	response.setContentType("text/html");
	ObjectMapper objectMapper = new ObjectMapper();
	JsonGenerator generator = objectMapper.getJsonFactory().createJsonGenerator(response.getOutputStream(),JsonEncoding.UTF8);    //设置JSON编码格式
	objectMapper.writeValue(generator, resultParam);
}

   

可参考:http://fujiangyong2009.blog.163.com/blog/static/126217857201292510823706/

----------------------------------------------------------------------------------------------------------------------------------

 

网上有很多人问,ajaxfileupload是否可以添加自定义参数支持,我的回答是:完全可以。只不过需要我们手动自己添加这样的支持,看了源代码,它也是封装了一个form表单,

咱们把需要的参数添加进去不就大功告成了嘛、说整就整、看代码:

。。。。上略
createUploadForm: function(id, fileElementId, data)
	{
		//create form	
		var formId = 'jUploadForm' + id;
		var fileId = 'jUploadFile' + id;
		var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');	
		var oldElement = $('#' + fileElementId);
		var newElement = $(oldElement).clone();
		$(oldElement).attr('id', fileId);
		$(oldElement).before(newElement);
		$(oldElement).appendTo(form);
		//添加参数支持
		if(data){
			$.each(data,function(key,value){
				$("<input type='hidden' name='"+key+"' value='"+value+"'/>").appendTo(form);
			})
		}
		//set attributes
		$(form).css('position', 'absolute');
		$(form).css('top', '-1200px');
		$(form).css('left', '-1200px');
		$(form).appendTo('body');		
		return form;
    },
。。。。。。下略
 
ajaxFileUpload: function(s) {
        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout		
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
        var id = new Date().getTime()        
		var form = jQuery.createUploadForm(id, s.fileElementId,s.data);
		var io = jQuery.createUploadIframe(id, s.secureuri);
		var frameId = 'jUploadFrame' + id;
		var formId = 'jUploadForm' + id;		
        // Watch for a new set of requests
        if ( s.global && ! jQuery.active++ )
		{
			jQuery.event.trigger( "ajaxStart" );
		} 
这两块代码稍作修改,即可添加自定义参数支持、那么ajaxfileupload的js中只需要添加一个参数:data:{},就可以了。注意它是一个对象。
$.ajaxFileUpload({
            url:'fileLoadTest.html',//用于文件上传的服务器端请求地址
            secureuri:false,//一般设置为false
            fileElementId:fileId,//文件上传空间的id属性  <input type="file" id="file" name="file" />
            dataType: 'json',//返回值类型 一般设置为json
            data:{"title":$("#titleId").val()},
            success: function (data, status) {
                if(typeof(data.error) != 'undefined'){
                   alert(data.msg);
                }
            },
            error: function (data, status, e) {
            	 alert(data.msg);
           	     alert(e);
            }
        })
 
 
注意: 附件我就不改了,大家自己稍微修改下即可使用。
分享到:
评论
9 楼 未闻花铭 2015-02-11  
我用的是Struts2,但是后台获取的file是NUll,求帮忙
8 楼 未闻花铭 2015-02-11  
362980633 写道
为什么我后台接的file是null啊

7 楼 362980633 2014-03-10  
aokunsang 写道
362980633 写道
为什么我后台接的file是null啊

如果你使用的是SpringMVC,检查下是否配置:org.springframework.web.multipart.commons.CommonsMultipartResolver;否则springMVC不会解析request为MultiRequest。

struts+spring 没用springmvc
6 楼 aokunsang 2014-03-10  
362980633 写道
为什么我后台接的file是null啊

如果你使用的是SpringMVC,检查下是否配置:org.springframework.web.multipart.commons.CommonsMultipartResolver;否则springMVC不会解析request为MultiRequest。
5 楼 362980633 2014-03-07  
为什么我后台接的file是null啊
4 楼 sunbinovic 2014-02-26  
谢谢美女,很受用
3 楼 k3108001263 2012-11-05  
text/plain也是行的
2 楼 k3108001263 2012-11-05  
谢谢,我使用text/plain不行,text/html就可以删掉struts-json
1 楼 gold__sun 2012-08-25  
谢谢你分享这个方法的使用,这个方法解决了不同浏览器获取不到绝对路径的问题,灰常感谢啊

相关推荐

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

    AjaxFileUpload是JQuery插件,用于实现异步文件上传功能,尤其适用于处理图片上传。在本文中,我们将详细介绍如何使用Struts 2和AjaxFileUpload组件来实现在Web应用程序中进行图片的上传与预览。 一、Struts 2 框架...

    ajaxFileUpload+struts2实现多文件上传(源码)

    在本文中,我们将深入探讨如何使用`ajaxFileUpload`与`Struts2`框架结合,实现多文件上传功能。这个示例源码提供了一个实用的方法,使得用户可以在不刷新整个页面的情况下,上传多个文件,提高了用户体验。 首先,`...

    struts2异步上传

    Struts2是一个非常流行的... Struts2异步上传结合了Struts2框架、jQuery、Ajax、JSON插件和文件处理策略,为用户提供了无刷新的文件上传体验。理解并熟练掌握这些组件和技术,对于开发高效、安全的Web应用至关重要。

    j​q​u​e​r​y​ ​i​m​g​a​r​e​a​s​e​l​e​c​t​ + ajaxfileupload + struts2实现图片的异步上传裁剪

    在IT领域,尤其是在Web开发中,实现图片的异步上传裁剪是一项常见的需求。这个项目是基于jQuery的imgAreaSelect插件、ajaxfileupload.js以及Struts2框架来完成这一功能的。接下来,我们将深入探讨这些关键技术点。 ...

    AjaxFileUpload Struts2 多文件上传

    本篇文章将深入讲解如何利用AjaxFileUpload与Struts2实现多文件上传,并结合jQuery进行前端交互。 首先,我们需要在项目中引入必要的库。Struts2提供了struts2-jquery-plugin,这是一个基于jQuery的插件,包含了...

    AjaxFileUpload结合Struts2实现多文件上传(动态添加文件上传框)

    AjaxFileUpload是一个用于实现文件上传的JavaScript插件,它允许用户在网页上轻松地上传文件,并支持异步上传文件而不刷新页面。结合Struts2框架,开发者可以在MVC模式中通过Action类处理文件上传的业务逻辑。 在...

    jquery之ajaxfileupload异步上传插件(附工程代码)

    点我下载工程代码 由于项目需求,在处理文件上传时需要使用到文件的异步上传。这里使用Jquery Ajax File Uploader这个组件下载地址:http://www.phpletter.com/download_project_version.php?version_id=6 服务器端...

    AjaxFileUpload+Struts2实现多文件上传功能

    在本文中,我们将深入探讨如何使用AjaxFileUpload插件与Struts2框架相结合来实现多文件上传的功能。AjaxFileUpload是一种基于JavaScript的轻量级插件,它允许用户在不刷新整个页面的情况下上传文件,提高了用户体验...

    jquery ajaxfileupload异步上传插件

    总结起来,使用jQuery的ajaxfileupload插件与Struts2框架相结合,可以实现异步文件上传功能。客户端通过JavaScript发起请求,服务器端的Struts2 Action接收并处理文件,然后通过JSON响应将结果返回给客户端。这种...

    Struts2+ajax+json异步上传图片回显

    在这个场景中,“Struts2+ajax+json异步上传图片回显”是指利用Struts2框架,通过Ajax技术实现图片的异步上传,并通过JSON进行数据交互,最终实现在页面上即时回显上传的图片。 首先,让我们理解每个组件的作用: ...

    jquery ajaxfileupload异步上传插件使用详解

    - 使用jQuery监听文件输入元素的点击事件(或其他适当的事件),在事件处理函数中调用`$.ajaxFileUpload`方法实现异步上传。 3. **文件校验**:在上传之前,插件支持对文件的类型、大小、尺寸等进行校验。这对于...

    ajax+jquery+struct+ajaxfileupload有增删改功能上传文件例子

    在这个例子中,我们结合了Ajax、jQuery、Struts以及AjaxFileUpload插件来实现这一目标。以下是关于这些技术及其应用的知识点详解: 1. **jQuery**:jQuery是一个高效、简洁的JavaScript库,它简化了HTML文档遍历、...

    jquery异步上传

    为了解决这个问题,jQuery提供了一种异步上传(Ajax Upload)的方式,可以在不刷新页面的情况下实现文件上传,提升用户体验。 **jQuery与Struts结合** jQuery是一个强大的JavaScript库,它简化了HTML文档遍历、...

    struts jquery 上传

    当我们结合Struts和jQuery进行文件上传操作时,可以实现更高效、用户体验更好的上传功能。 在Struts中,文件上传通常依赖于`struts2-convention-plugin`和`struts2-plugins`中的`struts2-file-uploading`插件。这些...

    struts2的上传和下载功能

    `ajaxfileupload.js`可能是一个用于前端文件上传的JavaScript库,如jQuery的AjaxFileUpload插件。它允许用户在不刷新页面的情况下上传文件,提高用户体验。你需要在JSP页面中引用这个脚本,并编写相应的JavaScript...

    struts2使用注解的上传下载功能

    - `canPushToItv.js`和`ajaxfileupload.js`可能是用于前端交互的JavaScript文件,特别是`ajaxfileupload.js`可能是一个用于异步文件上传的库,如jQuery的AjaxFileUpload插件。 - 这些脚本负责捕获表单数据,发送...

Global site tag (gtag.js) - Google Analytics