通过ajaxFileUpload异步请求上传文件(ajaxFileUpload+servlet实现文件上传下载)
1、最终效果
实现选择图片(此处以图片为例,支持所有类型文件的上传),选择之后将选择的图片在页面中显示出来,点击上传,可以将文件上传到指定的地址中,上传成功后在当前页面自动显示下载标签。
源码下载地址:链接:https://pan.baidu.com/s/17G63S9rkfFIfGBqwCwUHaA
提取码:52b7
2、技术结构
eclipse+servlet+ajaxFileUpload+windows
3、将文件上传下载依赖的包及js文件拷贝到创建好的项目中
说明:具体需要的文件要是没有可以从我提供的源码中下载
4、在项目的WebContent下创建index.jsp页面,并加入页面内容
说明:使用HTML页面也可以。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>测试文件上传下载</title><script type="text/javascript" src="js/jquery-1.8.0.min.js"></script><script type="text/javascript" src="js/ajaxfileupload.js" charset="GBK"></script><script type="text/javascript">//该函数实现将选中的图片直接显示到当前的页面中function setImagePreview(){ //得到上传的文件var docObj=document.getElementById("file");//得到img图片var imgObjPreview=document.getElementById("img1"); if(docObj.files && docObj.files[0]){ //火狐下,直接设img属性 imgObjPreview.src = window.URL.createObjectURL(docObj.files[0]);}else{//IE下,使用滤镜 //alert(docObj.select());docObj.select(); var imgSrc = document.selection.createRange().text;var localImagId = document.getElementById("imagediv"); var ImagId = document.getElementById("img1"); //必须设置初始大小 localImagId.style.width = "150px"; localImagId.style.height = "200px"; ImagId.style.width = "150px"; ImagId.style.height = "200px"; //图片异常的捕捉,防止用户修改后缀来伪造图片 try{ localImagId.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)"; localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgSrc; }catch(e){ alert("您上传的图片格式不正确,请重新选择!"); return false; } imgObjPreview.style.display = 'none'; document.selection.empty(); } return true; }</script><style type="text/css">#imagediv{width:150px;height:200px;background-color:red;margin:0 auto;border:#000000 solid 2px;text-align: center;}#file{position:absolute;z-index:100;opacity:0;filter:alpha(opacity=0);height:200px;readonly:true;
}
#uploadbutton{margin-top:10px;
}
</style></head><body><div id="imagediv"><input type="file" id="file" name="file" style="width:200px;" onchange="setImagePreview()"/> <img id="img1" src="data:image/add.jpg" style="width:150px;height:200px;" /><button id="uploadbutton" onclick="addInfo()">点击上传文件</button><a id="downImg" style="display:none" href="">下载</a></div></body>
</html>
【效果如下】
5、创建上传按钮的addInfo()函数,并实现异步请求上传代码编写
说明:
1、ajaxFileUpload向后端传递数据使用的是json类型参数。
2、success:函数为上传成功后的回调函数 $("#downImg").show();//待上传成功后 显示下载按钮
$("#downImg").attr("href","filedowload.do?filePath="+data.filePath);//设置下载标签的href具体下载地址
3、fileElementId参数:需要上传的文件域的ID,即<input type="file" id="file1">的ID。
4、data:向后端传递数据,与$.ajax使用方式相同。第一:通过js或者jquery技术获取输入框的值,放入到指定属性后,如:{"user_id":$("#user_id").val()}。第二:通过序列化技术直接提交表单,如:data:$("#form1").serialize()
5、secureuri:是否启用安全提交,默认为flase.
function addInfo(){alert("-----------------1-------------------------");$.ajaxFileUpload({url:"fileupload.do", //用于文件上传的服务器端请求地址secureuri: false, //一般设置为falsefileElementId: 'file', //文件控件的id<input type="file" id="file" name="file" />dataType:'json',data: {//向后端传递参数,为json字符产 "user_id": "1001", "user_name": "汤晓春" },success: function (data,status){ //服务器成功响应处理函数$("#downImg").show();//待上传成功后 显示下载按钮$("#downImg").attr("href","filedowload.do?filePath="+data.filePath);}});}
6、创建异步请求调用的servlet(请求地址名称:fileupload.do)
说明:
1、ServletFileUpload.isMultipartContent(request); 检查请求中是否有文件,返回一个boolean类型的值,true表示有文件file,false表示普通表单。
2、list.get(i).getString("utf-8");以utf-8编码集获取请求中的字符,如果不设置,会出现中文乱码。
3、下面代码使用到的地址:如D://aa,D://aa//temp,都是自定义路径,你可以使用自己的地址
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//修改请求和响应乱码request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");// 检查是否有一个文件上传请求,true表示有文件file,false表示普通表单boolean isMultipart = ServletFileUpload.isMultipartContent(request); System.out.println("isMultipart:"+isMultipart);if (!isMultipart){return; } //创建FileItem 对象的工厂DiskFileItemFactory factory = new DiskFileItemFactory(); //设置数据在内存缓存大小(byte)factory.setSizeThreshold(1024);//设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录File tempDir = new File("D://aa//temp"); //临时存放目录 factory.setRepository(tempDir);ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> list = null; try { list = upload.parseRequest(request); } catch (FileUploadException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //遍历解析list,list中包含表单字段内容和上传的文件内容。for(int i=0;i<list.size();i++){ //判断获取,表单中的文本数据if (list.get(i).isFormField()){//输出表单中的参数的name和valueif(list.get(i).getFieldName().equals("user_id")){//以utf-8编码集解析出请求中的数据System.out.println(list.get(i).getString("utf-8"));}if(list.get(i).getFieldName().equals("user_name")){System.out.println(list.get(i).getString("utf-8"));} } else {String fileName = list.get(i).getName();System.out.println("======fileName1======"+fileName);String saveDir = "D:/aa"; //文件存放路径,File uploadedFile= new File(saveDir);if(!uploadedFile.exists()){//假如目录不存在,就创建目录uploadedFile.mkdir();//创建aa目录}//输入流关联源文件--此事源文件被解析到了list集合中,所以通过list创建输入流InputStream is=list.get(i).getInputStream();//输出流关联目标文件OutputStream os=new FileOutputStream(uploadedFile+"//"+fileName);//传输文件--次数设置文件一次传输1Mbyte b[]=new byte[1024];while((is.read(b))!=-1){os.write(b);}os.flush();//关闭输出流前,刷新os.close();//关闭输出流is.close();//关闭输入流//返回文件的具体路径,供页面下载使用,并返回json字符串String filedir="D://aa//"+fileName;System.out.println("fileDir"+filedir);response.getWriter().print("{'filePath':'"+filedir+"'}");} } }
7、如上代码实现效果如下
8、实现下载功能,创建Servlet(请求名称为:filedowload.do)
说明:
1、上传文件后,下载按钮旁边会出现一个下载按钮
2、filePath路径直接传递的是完整的路径:如D://aa//1.jpg
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求中的文件地址,例如:D://aaa//1.jpgString filePath=request.getParameter("filePath");//从地址中解析出文件的名称,例如1.jpgString fileName=filePath.substring(filePath.lastIndexOf("//")+2);//修改附件格式,修改响应头,MIME协议格式判断//此时界面还没有弹出---判断文件属于那种类型。response.setContentType(getServletContext().getMimeType(fileName));//创建附件格式下载文件---实现弹出框效果。response.setHeader("Content-Disposition","attachment;filename="+fileName);//源文件在list中,通过getInputStream进行关联File file=new File(filePath);InputStream is=new FileInputStream(file);//创建输入流,关联目标文件OutputStream os=response.getOutputStream();//传输文件byte b[]=new byte[1024];while((is.read(b))!=-1){os.write(b);}//关闭资源os.flush();//刷新os.close();is.close();}
9、下载功能具体实现效果如下
不足之处可以在评论区之处,博主会及时回复和完善文章。
创作不易,关注点赞就是最大的动力。
通过ajaxFileUpload异步请求上传文件(ajaxFileUpload+servlet实现文件上传下载)相关推荐
- jsp 如何上传文件到服务器上,如何使用JSP / Servlet将文件上传到服务器?
问题: How can I upload files to server using JSP/Servlet? 如何使用JSP / Servlet将文件上传到服务器? I tried this: 我尝 ...
- java不用插件播放媒体文件_java servlet不用插件上传文件:
展开全部 import java.net.*; import java.io.*; import java.util.*; import javax.servlet.*; import javax.s ...
- servlet实现文件上传,预览,下载和删除
一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转 ...
- 4.2.2异步请求高级模式
4.2.2异步请求高级模式 有时候客户端响应对象中的数据比较简单,可能就只有一条数据,而且类型也是确定的.比如获取分区偏移量,客户端响应结果只有一条数据,类型为Long.我们可能希望从异步请求得到的结 ...
- Echarts 异步请求不能加载本地JSON数据解决方案,以及Http-Server安装与使用
文章目录 一.前言 二.分析&解决方案 三.Http-Server简介&安装方法 四.启动http本地服务方法 五.附:Http-Server可选配置 一.前言 最近学习eharts制 ...
- python异步处理请求_Python 异步请求
1. 正常下载漫画,requests 阻塞式. import requests, bs4, time import asyncio, aiohttp def get_image_urls(url): ...
- jq ajax异步上传文件,jQuery插件ajaxFileUpload异步上传文件
AjaxFileUpload.js并不是一个很出名的插件,只是别人写好的放出来供大家用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值. 当初做了个异步上传的功能,选择它因为它的配置 ...
- JQuery文件上传插件ajaxFileUpload在Asp.net MVC中的使用[转载]
转载:https://www.cnblogs.com/fonour/p/ajaxFileUpload.html 0 ajaxFileUpload简介 ajaxFileUpload插件是一个非常简单的基 ...
- Servlet学习DAY_02:重定向/ 文件上传/ Cookie和Session/ 导入一个工程 / 配置欢迎页面 / 同步请求和异步请求/JSON和AJax介绍 /过滤器
重定向 重定向是服务器告诉客户端往指定的路径再次发出请求的指令 执行过程: 当服务器执行重定向方法时会给客户端返回302状态码和一个请求路径,浏览器接收到302后会立即往指定的路径再次发出请求 res ...
最新文章
- findHomography(src_points, dst_points, CV_RANSAC)
- 管你MySQL还是Oracle,数据库管理就完事了
- Open source robotics toolkits: use virtual arenas to test your robotics algorithms
- Metal之探究理解视频渲染RGB与YUV颜色编码
- python代码模板_python 代码模板
- 怎样写出简洁的css代码??★★★★
- java中String类的用法
- as2的Key.isDown方法在as3的代替
- java 1亿个数字中_求一亿个数字里面最小的10个数字
- 中审咨询政府行业远程接入解决方案
- DotNet中的集合对象(2): Hashtable
- 如何判定某个类的职责是否够“单一”?
- arduino pro mini 迷你 ATmega328P 程序下载 usb-ttl reset
- 国内 OA 办公自动化系统 现状
- java: 找不到符号
- 语法长难句——并列句
- ABBYY FineReader 14
- 写论文一定要会-------中英文参考文献的导出方法
- 中国石油大学《工程概预算与招投标》第一阶段在线作业
- 架构设计:负载均衡层设计方案(8)——负载均衡层总结上篇
热门文章
- 基于树莓派车牌识别门禁系统
- 怎样快速在线将pdf文件转换成word
- 送礼送时尚 当然首选自由自在进口食品
- 记一次 .NET 某纺织工厂 MES系统 API 挂死分析
- 推荐一款免费的AI绘图软件,可生成二次元画作和3D模型
- mimikatz初使用——简单从winlogon.exe中获取系统密码
- 有为无为,在于人为——我的面试感悟
- BlackBerry 10使用Google TTS做中文文本朗读,开发语言C++ Qt Cascade
- ASP.NET 不错的机试题
- 笨办法学python3在线阅读知乎_Python第三课——笨办法学Python