热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

form、iframe实现异步上传文件

转载自:http:blog.csdn.netsunjing21articledetails4779321实现主要功能:页面提供一个上传图片的inputf

转载自:http://blog.csdn.net/sunjing21/article/details/4779321

实现主要功能:

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



JSP页面编写如下:

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

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

相应的JS代码&#xff1a;采用的是JQuery写的&#xff0c;不过写的很啰嗦&#xff0c;有点像是原始JS操作 

/*** 页面加载时完成操作*/
$(document).ready(
function() {
// 设置上传外观图$("#waiguan_add").bind("change", function() {submitImage("waiguan", 3);});
}
/*** 上传图片* * &#64;param {}* para_name 图片所属属性名* &#64;param {}* number 此类图片的总数量*/
function submitImage(para_name, number) {var para_form &#61; para_name &#43; "_form";var para_image &#61; para_name &#43; "_image";// alert(para_image);for (var i &#61; 1; i <&#61; number; i&#43;&#43;) {var srcValue &#61; $("#" &#43; para_image &#43; i).attr("src");// alert(srcValue);// alert(srcValue.length);if (srcValue &#61;&#61; "" || srcValue.length &#61;&#61; 0) {// alert("break");break;}}if (i > number) {alert("已超过了此类图的上传最大限");// 重置上传按钮&#xff0c;使之为空resetUploadBotton(para_name &#43; "_add");} else {$("#" &#43; para_form).submit();}
}
/*** iframe上传外观图片的返回操作* * &#64;param {}* msg 返回的图片所在地址*/
function callbackWaiguan(msg) {if (msg !&#61; "error") {for (var i &#61; 1; i <&#61; 3; i&#43;&#43;) {var srcValue &#61; $("#waiguan_image" &#43; i).attr("src");// alert(srcValue);if (srcValue &#61;&#61; "" || srcValue.length &#61;&#61; 0) {$("#waiguan_image" &#43; i).attr("src", msg);$("#waiguan_image" &#43; i).css("visibility", "visible");$("#waiguan_delete_image" &#43; i).css("visibility", "visible");$("#waiguan_delete_image" &#43; i).click(function() {deleteImage("waiguan", i);});break;}}} else {alert("上传图片失败&#xff0c;后台程序出现问题&#xff01;");}// 重置上传按钮&#xff0c;使之为空resetUploadBotton("waiguan_add");
}
/*** 删除某个图片时的异步操作* * &#64;param {}* para_name* &#64;param {}* number*/
function deleteImage(para_name, number) {var delete_image_id &#61; para_name &#43; "_image" &#43; number;var imagePathName &#61; $("#" &#43; delete_image_id).attr("src");if (para_name &#61;&#61; "waiguan") {$.get("deleteWaiguanImage.do", {deleteFile : imagePathName,t : Math.random()}, function(tag) {alert(tag);if (tag &#61;&#61; "true") {$("#" &#43; delete_image_id).attr("src", "");$("#" &#43; delete_image_id).css("visibility", "hidden");$("#" &#43; para_name &#43; "_delete_image" &#43; number).css("visibility","hidden");} else {alert("连接数据库失败&#xff0c;无法删除该图片!");}});}
}
/*** 重置上传按钮&#xff0c;使之为空* * &#64;param {}* para_name_add*/
function resetUploadBotton(para_name_add) {var form &#61; document.createElement("form");var span &#61; document.createElement("span");var para_image_file &#61; 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()提交&#xff0c;iframe的异步提交。 
返回操作将image的src的值&#xff0c;置为刚upload的图片在webroot中的位置&#xff0c;这样就能显示图片了。 
删除图片时&#xff0c;利用Ajax将要删除的图片路径发送到后台&#xff0c;进行删除&#xff0c;删除成功时&#xff0c;将页面html中image的src值置为空。


后台处理的方法如下&#xff1a; 

/*** 初始化SmartUpload类&#xff0c;用于上传文件* * &#64;param servlet* &#64;return SmartUpload* &#64;throws ServletException* &#64;throws IOException* &#64;throws SQLException*/public SmartUpload initSmartUpload(ActionServlet servlet)throws ServletException, IOException, SQLException {// 新建一个SmartUpload对象SmartUpload su &#61; new SmartUpload();javax.servlet.jsp.PageContext pageContext &#61; 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,"&#43; "tiff,jpeg,tga,exif,fpx,cad");// 4.设定禁止上传的文件su.setDeniedFilesList("exe,bat,jsp,htm,html");return su;}/*** 异步上传外观图* * &#64;param mapping* &#64;param form* &#64;param request* &#64;param response* &#64;return* &#64;throws Exception*/public ActionForward uploadWaiguanImage(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception {SeriesService seriesService &#61; ServiceFactory.getSeriesService(request,response);String filePathName &#61; null;boolean tag&#61; true;try {//初始化SmartUpload对象SmartUpload su &#61; seriesService.initSmartUpload(this.getServlet());//上传外观图&#xff0c;将文件存储在filePath中&#xff0c;遍历系列对象的外观图属性&#xff0c;将图片的位置存储在某一空的属性中 filePathName &#61; "upload/" &#43; seriesService.addWaiguanImage(su);} catch (Exception e) {e.printStackTrace();tag &#61; false;}PrintWriter out &#61; response.getWriter();if (tag &#61;&#61; true) {out.println("");} else {out.println("");}return null;}/*** 异步删除某个外观图* * &#64;param mapping* &#64;param form* &#64;param request* &#64;param response* &#64;return* &#64;throws Exception*/public ActionForward deleteWaiguanImage(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception {Integer seriesID &#61; (Integer) request.getSession().getAttribute("seriesID");String filePathName &#61; (String) request.getParameter("deleteFile");SeriesService seriesService &#61; ServiceFactory.getSeriesService(request,response);boolean tag &#61; true;try {//从数据库中和文件路径中删除外观图tag &#61; seriesService.deleteWaiguanImage(filePathName, seriesID);} catch (Exception e) {e.printStackTrace();tag &#61; false;}PrintWriter out &#61; response.getWriter();out.write(new Boolean(tag).toString());return null;}

这样&#xff0c;便完成了要实现的功能。



推荐阅读
  • 在HTML5应用中,Accordion(手风琴,又称抽屉)效果因其独特的展开和折叠样式而广泛使用。本文探讨了三种不同的Accordion交互效果,通过层次结构优化信息展示和页面布局,提升用户体验。这些效果不仅增强了视觉效果,还提高了内容的可访问性和互动性。 ... [详细]
  • jQuery插件验证与屏幕键盘功能的集成解决方案
    本文介绍了一种集成了验证功能和屏幕键盘的jQuery插件解决方案。该插件不仅提供了强大的表单验证功能,还引入了一个高度可定制的屏幕键盘,以增强用户体验。通过这一集成方案,开发者可以轻松实现复杂的表单验证逻辑,并为用户提供便捷的输入方式,特别适用于移动设备或特殊输入场景。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文深入解析了 jQuery 中用于扩展功能的三个关键方法:`$.extend()`、`$.fn` 和 `$.fn.extend()`。其中,`$.extend()` 用于扩展 jQuery 对象本身,而 `$.fn.extend()` 则用于扩展 jQuery 的原型对象,使自定义方法能够作为 jQuery 实例的方法使用。通过这些方法,开发者可以轻松地创建和集成自定义插件,增强 jQuery 的功能。文章详细介绍了每个方法的用法、参数及实际应用场景,帮助读者更好地理解和运用这些强大的工具。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 为开发者提供了一系列实用的参考网站和资源链接,包括HTML速查手册( 和 ),帮助开发者快速查找和学习相关技术知识。此外,还涵盖了其他重要的开发工具和文档,为编程工作提供全面支持。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • 在使用 jQuery 的 `html()` 方法时,我发现了一个奇怪的现象:该方法无法完整地插入指定的字符串内容。具体来说,当尝试插入较长或包含特殊字符的字符串时,部分内容可能会被截断或丢失。这一问题可能与 jQuery 对字符串的处理方式有关,建议在实际应用中进行充分测试以确保数据完整性。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 在 Angular Google Maps 中实现图片嵌入信息窗口的功能,可以通过使用 `@agm/core` 库来实现。该库提供了丰富的 API 和组件,使得开发者可以轻松地在地图上的信息窗口中嵌入图片。本文将详细介绍如何配置和使用这些组件,以实现动态加载和显示图片的功能。此外,还将探讨一些常见的问题和解决方案,帮助开发者更好地集成这一功能。 ... [详细]
  • 本文详细介绍了 jQuery 的入门知识与实战应用,首先讲解了如何引入 jQuery 库及入口函数的使用方法,为初学者提供了清晰的操作指南。此外,还深入探讨了 jQuery 在实际项目中的多种应用场景,包括 DOM 操作、事件处理和 AJAX 请求等,帮助读者全面掌握 jQuery 的核心功能与技巧。 ... [详细]
  • 本文深入剖析了jQuery的架构设计与实现原理。jQuery的总体结构采用了一个自执行匿名函数的形式,该函数接收`window`和`undefined`作为参数,并在内部定义了一个局部的jQuery副本,以确保其内部变量和方法不会污染全局命名空间。这种设计不仅提高了代码的封装性和安全性,还使得jQuery能够更好地与其他JavaScript库兼容。通过详细分析这一架构,读者可以更好地理解jQuery的核心机制及其高效运行的原理。 ... [详细]
  • 在Linux系统中,为了提高安全性,可以通过设置命令执行超时和用户超时注销来防止因用户长时间未操作而带来的安全隐患。具体而言,可以通过编辑 `/etc/profile` 文件,添加或修改相关参数,确保用户在指定时间内无操作后自动注销。此外,还可以利用 `timeout` 命令来限制特定命令的执行时间,进一步增强系统的稳定性和安全性。 ... [详细]
  • 《精通 jQuery》第六章:深入解析与实战应用
    《精通 jQuery》第六章:深入解析与实战应用本章详细探讨了 Ajax 技术的核心机制及其实际应用。Ajax 通过 XMLHttpRequest 对象实现客户端与服务器之间的异步数据交换,从而在不重新加载整个页面的情况下更新部分内容。这种技术不仅提升了用户体验,还提高了应用的响应速度和效率。此外,本章还介绍了如何利用 jQuery 简化 Ajax 操作,并提供了多个实战案例,帮助读者更好地理解和掌握这一重要技术。 ... [详细]
author-avatar
3号仔小麦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有