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

iframe实现图片异步上传

阅读更多
实现主要功能:
  • 页面提供一个上传图片的input file选择框,用于上传某一类型的数张图片
  • 每次选择完本地图片后,图片便异步存储到后台的文件夹中;
  • 并将路径信息存储到数据库中;
  • 页面上显示此图的缩略图,并在旁边显示一个删除标记,当点击时,将此图片从页面、数据库、后台的文件夹中删除
  • input file选择框清空,再点击用于上传下一张图片;


JSP页面编写如下:
<div>
	<form action="uploadWaiguanImage.do" id="waiguan_form" name="waiguan_form" 
          enctype="multipart/form-data" method="post" target="waiguan_hidden_frame">
    	<span>
    		<label>外观图</label>
    		<img src="images/addImage.JPG">
    		<input type="file" id="waiguan_add" name="waiguan_add"/>
    	</span>
    	<iframe name="waiguan_hidden_frame" id="waiguan_hidden_frame" style="display:none"></iframe>
    	<c:forEach var="x" begin="1" end="3" step="1">
    		<span>
    			<img id="waiguan_image${x }" style="visibility:hidden" src="" width="100" alt="外观图${x }"/>
    			<img id="waiguan_delete_image${x }" style="visibility:hidden;cursor: pointer" src="images/deleteImage.JPG"/>
    		</span>
    	</c:forEach>
    </form>   					
</div>

让form的target值为iframe,当form提交的时候,是异步iframe进行提交,不会影响页面的其他部分。
c:forEach部分是首先隐藏了上传后显示的图片标签和删除标签(这里最大可以上传三张)

相应的JS代码:采用的是JQuery写的,不过写的很啰嗦,有点像是原始JS操作

/**
 * 页面加载时完成操作
 */
$(document).ready(function() {
// 设置上传外观图
	$("#waiguan_add").bind("change", function() {
		submitImage("waiguan", 3);
	});
}

/**
 * 上传图片
 * 
 * @param {}
 *            para_name 图片所属属性名
 * @param {}
 *            number 此类图片的总数量
 */
function submitImage(para_name, number) {
	var para_form = para_name + "_form";
	var para_image = para_name + "_image";

	// alert(para_image);

	for (var i = 1; i <= number; i++) {
		var srcValue = $("#" + para_image + i).attr("src");
		// alert(srcValue);
		// alert(srcValue.length);
		if (srcValue == "" || srcValue.length == 0) {
			// alert("break");
			break;
		}
	}

	if (i > number) {
		alert("已超过了此类图的上传最大限");
		// 重置上传按钮,使之为空
		resetUploadBotton(para_name + "_add");
	} else {

		$("#" + para_form).submit();
	}
}

/**
 * iframe上传外观图片的返回操作
 * 
 * @param {}
 *            msg 返回的图片所在地址
 */
function callbackWaiguan(msg) {

	if (msg != "error") {
		for (var i = 1; i <= 3; i++) {
			var srcValue = $("#waiguan_image" + i).attr("src");
			// alert(srcValue);
			if (srcValue == "" || srcValue.length == 0) {
				$("#waiguan_image" + i).attr("src", msg);
				$("#waiguan_image" + i).css("visibility", "visible");
				$("#waiguan_delete_image" + i).css("visibility", "visible");
				$("#waiguan_delete_image" + i).click(function() {

					deleteImage("waiguan", i);

				});
				break;
			}
		}
	} else {
		alert("上传图片失败,后台程序出现问题!");
	}

	// 重置上传按钮,使之为空
	resetUploadBotton("waiguan_add");
}

/**
 * 删除某个图片时的异步操作
 * 
 * @param {}
 *            para_name
 * @param {}
 *            number
 */
function deleteImage(para_name, number) {
	var delete_image_id = para_name + "_image" + number;
	var imagePathName = $("#" + delete_image_id).attr("src");
	
	if (para_name == "waiguan") {

		$.get("deleteWaiguanImage.do", {
			deleteFile : imagePathName,
			t : Math.random()
		}, function(tag) {

			alert(tag);
			if (tag == "true") {
				$("#" + delete_image_id).attr("src", "");
				$("#" + delete_image_id).css("visibility", "hidden");
				$("#" + para_name + "_delete_image" + number).css("visibility",
						"hidden");
			} else {
				alert("连接数据库失败,无法删除该图片!");
			}
		});
	}
}

/**
 * 重置上传按钮,使之为空
 * 
 * @param {}
 *            para_name_add
 */
function resetUploadBotton(para_name_add) {
	var form = document.createElement("form");
	var span = document.createElement("span");
	var para_image_file = document.getElementById(para_name_add);
	para_image_file.parentNode.insertBefore(span, para_image_file);
	form.appendChild(para_image_file);
	form.reset();
	span.parentNode.insertBefore(para_image_file, span);
	span.parentNode.removeChild(span);
	form.parentNode.removeChild(form);

}


上传图片采用的是定义的form的submit()提交,iframe的异步提交。
返回操作将image的src的值,置为刚upload的图片在webroot中的位置,这样就能显示图片了。
删除图片时,利用Ajax将要删除的图片路径发送到后台,进行删除,删除成功时,将页面html中image的src值置为空。

后台处理的方法如下:
/**
	 * 初始化SmartUpload类,用于上传文件
	 * 
	 * @param servlet
	 * @return SmartUpload
	 * @throws ServletException
	 * @throws IOException
	 * @throws SQLException
	 */
	public SmartUpload initSmartUpload(ActionServlet servlet)
			throws ServletException, IOException, SQLException {
		// 新建一个SmartUpload对象
		SmartUpload su = new SmartUpload();

		javax.servlet.jsp.PageContext pageContext = JspFactory
				.getDefaultFactory().getPageContext(servlet, request, response,
						null, true, 8192, true);
		// 上传初始化
		su.initialize(pageContext);

		// 设定上传限制
		// 1.限制每个上传文件的最大长度。
		su.setMaxFileSize(10000000);

		// 2.限制总上传数据的长度。
		su.setTotalMaxFileSize(20000000);

		// 3.设定允许上传的文件
		su.setAllowedFilesList("jpg,gif,bmp,pcx,"
				+ "tiff,jpeg,tga,exif,fpx,cad");

		// 4.设定禁止上传的文件
		su.setDeniedFilesList("exe,bat,jsp,htm,html");

		return su;
	}


/**
	 * 异步上传外观图
	 * 
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ActionForward uploadWaiguanImage(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		SeriesService seriesService = ServiceFactory.getSeriesService(request,
				response);

		String filePathName = null;

		boolean tag= true;
		try {
			//初始化SmartUpload对象
			SmartUpload su = seriesService.initSmartUpload(this.getServlet());
			//上传外观图,将文件存储在filePath中,遍历系列对象的外观图属性,将图片的位置存储在某一空的属性中 
			filePathName = "upload/" + seriesService.addWaiguanImage(su);

		} catch (Exception e) {
			e.printStackTrace();
			tag = false;
		}

		PrintWriter out = response.getWriter();
		if (tag == true) {
			out.println("<script>parent.callbackWaiguan('" + filePathName
					+ "')</script>");
		} else {
			out.println("<script>parent.callbackWaiguan('error')</script>");
		}

		return null;
	}

/**
	 * 异步删除某个外观图
	 * 
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ActionForward deleteWaiguanImage(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		Integer seriesID = (Integer) request.getSession().getAttribute(
				"seriesID");
		String filePathName = (String) request.getParameter("deleteFile");

		SeriesService seriesService = ServiceFactory.getSeriesService(request,
				response);
		boolean tag = true;
		try {
			//从数据库中和文件路径中删除外观图
			tag = seriesService.deleteWaiguanImage(filePathName, seriesID);
		} catch (Exception e) {
			e.printStackTrace();
			tag = false;
		}

		PrintWriter out = response.getWriter();

		out.write(new Boolean(tag).toString());

		return null;
	}

这样,便完成了要实现的功能。
分享到:
评论
10 楼 wyxy2005 2011-11-22  
ie下,$("#waiguan_add").bind("change"  这个的事件出发需要点from之外点击之后才开始上传。火狐是可以正常执行的,不理解为什么出现这个情况
9 楼 zjiaohuang 2010-01-21  
这里有一个用FancyUpload实现的demo,个人认为FancyUpload实现的上传简单实用。API同时也是十分详细
8 楼 sunrisetg 2010-01-20  
楼主能把 该实验的源码 上传看看吗?
7 楼 makemyownlife 2009-11-06  
wnzz95391511 写道
Army 写道

有人专门写过仿163网盘无刷新文件上传的,那个很详细,而且不依赖于库。


没有搜索到,倒是挺想看看的。
无刷新上传:主要的问题都是出在前台的操作上,后台接收文件相对来说要好解决些的。
依赖库也主要是后台的操作。

仿163网盘无刷新文件上传确实有,你好好上网查查,写这篇文章的作者也写了很多其他的ajax方面的文章,从中获益良多,而且注释也很详细,上次我有了问题还向他请教了。
6 楼 willko 2009-11-05  
swfupload挺好的。
还能跨域
5 楼 liwenshui322 2009-11-05  
看不懂 
4 楼 wnzz95391511 2009-06-02  
Army 写道

有人专门写过仿163网盘无刷新文件上传的,那个很详细,而且不依赖于库。


没有搜索到,倒是挺想看看的。
无刷新上传:主要的问题都是出在前台的操作上,后台接收文件相对来说要好解决些的。
依赖库也主要是后台的操作。
3 楼 Army 2009-06-02  
有人专门写过仿163网盘无刷新文件上传的,那个很详细,而且不依赖于库。
2 楼 zgz888 2009-06-02  
好东西,谢谢了
1 楼 langhua9527 2009-05-27  
好东东,收藏一下,需的时候来看。。。我原来在一个项目里都准备做异步上传的,结果时间关系,就同步了。。。。

相关推荐

    iframe实现图片异步上传.doc

    综上所述,通过`iframe`实现图片异步上传是一种常见的技术方案,它结合了HTML、JavaScript(jQuery)、JSP以及服务器端的处理,实现了无刷新的文件上传体验,提高了用户的交互性和系统的响应速度。在实际应用中,还...

    js加iframe轻松实现异步图片上传 可以预览 兼容FF,chrome,ie9

    这个"异步上传图片Demo"压缩包中应该包含了实现以上步骤的HTML、CSS和JavaScript代码,通过查看和学习这些代码,你可以更深入地理解异步图片上传与预览的实现细节。实际开发时,还需要考虑错误处理、进度显示、多...

    php之表单文件iframe异步上传

    "iframe异步上传"技术就是为了解决这个问题而出现的一种解决方案。这种技术结合了HTML的`&lt;iframe&gt;`元素和JavaScript,使得文件能够后台静默上传,不影响用户在页面上的其他操作。 首先,我们要理解什么是`&lt;iframe&gt;`...

    [php]ifame仿ajax图片上传预览,兼容IE\FF\Chrome

    总的来说,这个项目提供了一个基于iframe的跨浏览器图片上传预览解决方案,对于那些需要在老式浏览器上实现类似功能的开发者来说,是一个有价值的参考资料。通过深入研究和理解这个项目的源码,我们可以学习到如何在...

    iframe实现页面局部刷新操作

    在本案例中,我们将讨论如何利用`iframe`来实现图片的上传和无刷新展示,以及涉及到的PHP和jQuery技术。 首先,`iframe`的基本用法是在HTML中创建一个`&lt;iframe&gt;`标签,并为其指定`src`属性,指向要加载的页面URL。...

    php+ajax实现图片文件上传功能实例

    PHP和Ajax实现图片文件上传功能是Web开发中一个常见需求,随着互联网技术的发展,异步文件上传也越来越受到开发者的青睐。异步文件上传指的是在用户不刷新页面的情况下,完成文件的上传过程。常见的实现方式包括使用...

    iframe图片上传接口(某项目中的图片接口,图片存成oracle中的Blob)

    这个项目中,开发者使用了`iframe`来实现图片的上传,同时将图片数据存储到Oracle数据库的Blob类型字段中。Blob(Binary Large Object)是数据库系统用来存储二进制大对象的数据类型,如图像、音频或视频文件。接...

    asp上传大全之四iframe上传组件

    综上所述,"ASP上传大全之四iframe上传组件"主要探讨了如何在ASP环境中,利用iframe实现无刷新的文件上传,涉及了HTML、JavaScript、ASP及服务器端的安全控制等多个技术层面。理解和掌握这些知识点,将有助于构建...

    异步文件上传组件Uploader.zip

    Uploader是非常强大的异步文件上传组件,支持ajax、iframe、flash三套方案,实现浏览器的全兼容,调用非常简单,内置多套主题支持 和常用插件,比如验证、图片预览、进度条等,广泛应用于淘宝网,比如退款系统、...

    ckeditor 自己实现图片上传功能 和源代码

    为了实现图片上传,我们需要做以下步骤: 1. **添加上传按钮**:首先,你需要在CKEditor的工具栏上添加一个用于上传图片的按钮。这可以通过修改配置文件或者直接在初始化CKEditor时添加按钮代码实现。例如,你可以...

    原生ajax和iframe框架实现图片文件上传的两种方式

    大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参考,具体内容如下 ...

    iframe图片上传+用户本地加载图片+jquery表达验证+视频解析demo

    在图片上传场景中,iframe常被用来处理文件上传的异步请求,因为文件上传通常涉及到POST表单提交,可能导致页面刷新。通过在iframe中进行表单提交,可以在后台处理文件上传,而不会影响主页面的用户体验。开发者通常...

    异步上传组件uploader基于kissy

    2. **IFrame上传**:IFrame方式利用了HTML的IFrame元素,创建一个隐藏的IFrame来提交表单,实现文件的异步上传。这种方式在不支持Flash和HTML5 File API的浏览器中依然有效,但是其性能相对较差,且无法获取到上传...

    JS实现异步上传压缩图片

    摘要: 使用iframe来处理异步上传图片,在现在这个时代来说,多多少少都有点落后了!单单就凭AJAX和JS就不能做到异步上传图片了吗? 感谢 think2011 这位兄台的JS库:https://github.com/think2011/LocalResizeIMG 先...

    ajax文件异步上传工具

    以上代码展示了如何使用jQuery File Upload插件实现基本的文件异步上传功能,包括选择文件、设置上传URL以及处理上传成功和失败的回调。 ### 7. 总结 异步文件上传是现代Web应用不可或缺的一部分,jQuery File ...

    java上传图片后立即将图片显示出来

    7. **异步处理**:考虑到用户体验,可以使用Ajax进行异步上传,这样在上传过程中不会阻塞用户界面,同时也可以展示上传进度。 综上所述,"java上传图片后立即将图片显示出来"这一功能的实现涉及到Java的文件上传...

    JavaScript实现图片伪异步上传过程解析

    在JavaScript中实现图片的伪异步上传是一种模拟Ajax文件上传的方法,因为标准的Ajax技术由于安全原因不支持直接上传文件。这种技术的核心是利用HTML的`&lt;form&gt;`表单和`&lt;iframe&gt;`来实现文件的后台上传,同时保持用户...

    PHP+iFrame实现页面无需刷新的异步文件上传

    虽然现代的Web开发中较少使用,但在某些特定场景下,比如文件异步上传,iframe仍具有其独特优势。 2. **指定iframe的name属性**:在iframe标签中通过设置name属性来标识一个iframe,使其可以作为表单提交的目标窗口...

    asp\php无组件批量上传 支持html5\form\swf\iframe等方式上传

    `iframe`目录可能包含使用IFrame实现上传的示例代码。 6. **更新与清理脚本**: `update.vbs`和`clear.vbs`可能是VBScript编写的脚本,用于更新或清理上传的文件。例如,`update.vbs`可能用于自动更新服务器上的...

Global site tag (gtag.js) - Google Analytics