文件上传
来源:互联网 发布:淘宝网wap访客是 编辑:程序博客网 时间:2024/06/06 00:39
采用commons-fileUpload ,ajax实现文件上传进度条
2012-05-25 15:54 4127人阅读 评论(4)收藏举报
ajaxstringfilesessionservletcallback
首先 说明 本次只是简单的实现了 文件上传的进度和进度条显示 不支持 断点续传和取消
最近想动手 实现以下文件上传能够显示进度条 ,网上查了一下有的采用的是假的进度或者就是第三方插件。
无意中有重新看了一下apache commons-fileupload的官网 在用户指南最下边我们会发现有这个:
这不就是文件上传的进度监听嘛 ,apache都为我们做好了 为什么还要用什么第三方插件呢/
现在 就大概说一下实现思路吧:
- 自定义一个进度监听类实现ProgressListener接口 重写update方法 具体实现可以直接参考官网上面的
- 通过以读取的字节数跟文件总的字节数生成读取百分比 将该数字放在session中
- 创建一个servlet用来获取session中的百分比
- 在上传文件界面 在表单提交的时候 用ajax每隔100毫秒 访问 上文创建的servlet响应的百分比值 显示在界面
具体实现代码如下:
上传界面index.jsp的js:
- <script type="text/javascript">
- function callback(){
- $.ajax({
- type:"post",
- url:"FileUploadStatus",//响应文件上传进度的servlet
- success:function(msg){
- document.getElementById("span").innerHTML="已上传:"+msg;//显示读取百分比
- document.getElementById("table").width=msg;//通过表格宽度 实现进度条
- }
- })
- }
- function formSubmit(){
- window.setInterval("callback()", 100);//每隔100毫秒执行callback
- document.form.submit();
- }
<script type="text/javascript"> function callback(){ $.ajax({type:"post",url:"FileUploadStatus",//响应文件上传进度的servletsuccess:function(msg){document.getElementById("span").innerHTML="已上传:"+msg;//显示读取百分比document.getElementById("table").width=msg;//通过表格宽度 实现进度条}}) } function formSubmit(){ window.setInterval("callback()", 100);//每隔100毫秒执行callback document.form.submit(); }
index.jsp 表单:
- <form action="FileUploadServlet" method="post" enctype="multipart/form-data" target="_parent" name="form">
- <input type="file" name="file" ><input type="button" onclick="formSubmit()" value="提交">
- </form>
- <span id="span"></span>
- <table width="300px;" border="0"><tr><td>
- <table id="table" height="20px;" style="background-color: gray;"><tr><td></td></tr></table>//用来实现进度条显示
- </td>
- </tr>
- </table>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data" target="_parent" name="form"> <input type="file" name="file" ><input type="button" onclick="formSubmit()" value="提交"> </form> <span id="span"></span> <table width="300px;" border="0"><tr><td> <table id="table" height="20px;" style="background-color: gray;"><tr><td></td></tr></table>//用来实现进度条显示 </td> </tr> </table>
- 自定义进度监听类myProgressListener实现ProgressListener
自定义进度监听类myProgressListener实现ProgressListener
- public class myProgressListener implements ProgressListener {
- private double megaBytes = -1;
- private HttpSession session;
- public myProgressListener(HttpServletRequest request) {
- session=request.getSession();
- }
- public void update(long pBytesRead, long pContentLength, int pItems) {
- double mBytes = pBytesRead / 1000000;
- double total=pContentLength/1000000;
- if (megaBytes == mBytes) {
- return;
- }
- System.out.println("total====>"+total);
- System.out.println("mBytes====>"+mBytes);
- megaBytes = mBytes;
- System.out.println("megaBytes====>"+megaBytes);
- System.out.println("We are currently reading item " + pItems);
- if (pContentLength == -1) {
- System.out.println("So far, " + pBytesRead + " bytes have been read.");
- } else {
- System.out.println("So far, " + pBytesRead + " of " + pContentLength
- + " bytes have been read.");
- double read=(mBytes/total);
- NumberFormat nf=NumberFormat.getPercentInstance();
- System.out.println("read===>"+nf.format(read));//生成读取的百分比 并放入session中
- session.setAttribute("read", nf.format(read));
- }
- }
- }
public class myProgressListener implements ProgressListener {private double megaBytes = -1;private HttpSession session;public myProgressListener(HttpServletRequest request) {session=request.getSession();}public void update(long pBytesRead, long pContentLength, int pItems) {double mBytes = pBytesRead / 1000000;double total=pContentLength/1000000; if (megaBytes == mBytes) { return; } System.out.println("total====>"+total); System.out.println("mBytes====>"+mBytes); megaBytes = mBytes; System.out.println("megaBytes====>"+megaBytes); System.out.println("We are currently reading item " + pItems); if (pContentLength == -1) { System.out.println("So far, " + pBytesRead + " bytes have been read."); } else { System.out.println("So far, " + pBytesRead + " of " + pContentLength + " bytes have been read."); double read=(mBytes/total); NumberFormat nf=NumberFormat.getPercentInstance(); System.out.println("read===>"+nf.format(read));//生成读取的百分比 并放入session中 session.setAttribute("read", nf.format(read)); }}}
封装FileUpload 用来接收request中的表单域 和 file文件域
- public class FileUpload {
- private Map<String,String> params;
- private Map<String,FileItem> files;
- public FileUpload() {
- params=new HashMap<String, String>();
- files=new HashMap<String, FileItem>();
- }
- public void setMap(HttpServletRequest request){
- // Create a factory for disk-based file items
- FileItemFactory factory = new DiskFileItemFactory();
- // Create a new file upload handler
- ServletFileUpload upload = new ServletFileUpload(factory);
- upload.setHeaderEncoding("utf-8");
- upload.setProgressListener(new myProgressListener(request));//设置进度监听器
- // Parse the request
- try {
- List items = upload.parseRequest(request);
- Iterator iter = items.iterator();
- while (iter.hasNext()) {
- FileItem item = (FileItem) iter.next();
- if (item.isFormField()) {
- String name = item.getFieldName();
- String value = item.getString();
- params.put(name, value);
- }
- else{
- String name=item.getFieldName();
- files.put(name, item);
- }
- }
- } catch (FileUploadException e) {
- e.printStackTrace();
- }
- }
- public Map<String, String> getParams() {
- return params;
- }
- public Map<String, FileItem> getFiles() {
- return files;
- }
- //用来获取文件的名字
- public String getFileName(FileItem item){
- String fName=item.getName();
- System.out.println("fname=====>"+fName);
- int lastIndex=fName.lastIndexOf("\\");
- fName=fName.substring(lastIndex+1);
- System.out.println("new fname=====>"+fName);
- return fName;
- }
- }
public class FileUpload {private Map<String,String> params;private Map<String,FileItem> files;public FileUpload() {params=new HashMap<String, String>();files=new HashMap<String, FileItem>();}public void setMap(HttpServletRequest request){// Create a factory for disk-based file itemsFileItemFactory factory = new DiskFileItemFactory();// Create a new file upload handlerServletFileUpload upload = new ServletFileUpload(factory);upload.setHeaderEncoding("utf-8");upload.setProgressListener(new myProgressListener(request));//设置进度监听器// Parse the requesttry {List items = upload.parseRequest(request);Iterator iter = items.iterator();while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString(); params.put(name, value); } else{ String name=item.getFieldName(); files.put(name, item); }}} catch (FileUploadException e) {e.printStackTrace();}}public Map<String, String> getParams() {return params;}public Map<String, FileItem> getFiles() {return files;}//用来获取文件的名字public String getFileName(FileItem item){String fName=item.getName();System.out.println("fname=====>"+fName);int lastIndex=fName.lastIndexOf("\\");fName=fName.substring(lastIndex+1);System.out.println("new fname=====>"+fName);return fName;}}
实现文件上传的servlet
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html;charset=utf-8");
- PrintWriter out = response.getWriter();
- FileUpload fu=new FileUpload();
- fu.setMap(request);//解析request
- Map<String,FileItem> files=fu.getFiles();
- String fileName =fu.getFileName(files.get("file"));
- File file=new File(this.getServletContext().getRealPath("upload\\"+fileName));
- try {
- files.get("file").write(file);
- } catch (Exception e) {
- e.printStackTrace();
- }
- out.println("<script>alert('上传成功!');history.back();</script>");
- }
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();FileUpload fu=new FileUpload();fu.setMap(request);//解析requestMap<String,FileItem> files=fu.getFiles();String fileName =fu.getFileName(files.get("file"));File file=new File(this.getServletContext().getRealPath("upload\\"+fileName));try {files.get("file").write(file);} catch (Exception e) {e.printStackTrace();}out.println("<script>alert('上传成功!');history.back();</script>");}
实现用来响应上传进度的servlet FileUploadStatus
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html;charset=utf-8");
- PrintWriter out = response.getWriter();
- HttpSession session=request.getSession();
- String status=(String) session.getAttribute("read");//获取上传进度百分比
- System.out.println(status+"FileUploadStatus");
- out.println(status);//响应
- }
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();HttpSession session=request.getSession();String status=(String) session.getAttribute("read");//获取上传进度百分比System.out.println(status+"FileUploadStatus");out.println(status);//响应}
效果如下图:
测试 过程中 小文件 可能效果不明显 最好弄个大文件测试一下
实现方法、效果可能不是多完美 但好歹 也是亲自实现的 还是挺开心的额.....
0 0
- 文件上传---文件上传
- 上传文件
- 文件上传
- 上传文件
- 文件上传
- 文件上传
- 上传文件
- 上传文件
- 文件上传
- 文件上传
- 文件上传
- 文件上传
- 文件上传
- 文件上传
- 文件上传
- 上传文件
- 文件上传
- 文件上传
- Eclipse Building workspace.GC overhead limit exceeded 解决方法
- Ubuntu 下Software center的默认安装路径
- 实战中遇到的C++流文件重置的一个大陷阱: 为什么ifstream的seekg函数无效?
- 2.21 用偶判断,不用奇判断
- 1151 魔板
- 文件上传
- 求n的算术平方根(计算平方根的巴比伦的方法)
- hdu5086——Revenge of Segment Tree
- Ubuntu切换Python3
- 从JVM内存管理的角度谈谈静态方法和静态属性
- AndroidL系列-CardView
- 基础搜索入门(二)
- Android 之ndk开发
- quick sort 的C++正确实现