`
jym1340056078
  • 浏览: 2711 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

文件上传 监听

 
阅读更多

一、文件上传
1、前提条件:
form表单提供input type="file"类型的输入域,必须有name属性
form表单的enctype属性取值为multipart/form-data
form表单的method提交方式为post方式
2、如果表单的enctype设置成了multipart/form-data,那么传统获取参数的方式就失效了。

3、上传文件的请求正文内容如下:
-----------------------------7dc22234707de
Content-Disposition: form-data; name="username"

wzt

-----------------------------7dc22234707de
Content-Disposition: form-data; name="photo1"; filename="C:\Documents and Settings\鐜嬫槶鐝絓妗岄潰\a.txt"

Content-Type: text/plain

aaaaaa

-----------------------------7dc22234707de
Content-Disposition: form-data; name="photo2"; filename="C:\Documents and Settings\鐜嬫槶鐝絓妗岄潰\b.txt"
Content-Type: text/plain
bbbbbb
-----------------------------7dc22234707de--

按照MIME协议进行描述的。

二、利用apache-commons-fileupload组件进行文件上传
1、所需jar包
commons-fileupload.jar
commons-io.jar
2、核心类
DiskFileItemFacotry:创建FileItem的工厂。
还能设置缓存大小(默认10k)和临时文件的存放路径
ServletFileUpload:解析请求的正文,得到代表表单某一部分的FileItem对象
FileItem:代表表单中的一个输入域
boolean isFormField():是否是普通表单数据
String getFieldName():得到普通输入域的名称
String getString():得到普通输入域提交的数据值
InputStream getInputStream():得到上传域的输入流
String getName():得到上传文件的名称

三、文件上传时需要考虑的9大问题
1、上传文件名的中文乱码和表单数据的中文乱码(传统的设置编码无效)
普通字段中文数据
FileItem.getString(编码)
上传文件名中文乱码:
方式一:request.setCharacterEncoding("UTF-8")
方式二:ServletFileUpload.setHeaderEncoding("UTF-8");

2、如何保证服务器的安全
把上传的文件放到用户访问不到的地方WEB-INF

3、多次上传同名文件的覆盖
UUID更改文件名,保证不重复
UUID_文件名
当前的毫秒值:(乐观者)

4、如何防止同一目录下文件太多的问题
分目录存储

hashcode算目录
1100 0011 1101 1100 0101 0001 1010 1101
0000 0000 0000 0000 0000 0000 0000 1111
0000 0000 0000 0000 0000 0000 0000 1101  0~15
1100 0011 1101 1100 0101 0001 1010 1101
0000 0000 0000 0000 0000 0000 1111 0000
0000 0000 0000 0000 0000 0000 1010 0000>>4

0000 0000 0000 0000 0000 0000 0000 1010 0~15

 

5、上传文件的大小控制(单个文件和总大小),及如何友好提示用户
单个文件:
单个文件大小限制:
ServletFileUpload.setFileSizeMax(字节)
超出了大小:FileUploadBase.FileSizeLimitExceededException异常

总文件大小:
ServletFileUpload.setSizeMax(字节)
超出了大小:FileUploadBase.SizeLimitExceededException异常

6、超出10k的文件的临时文件的处理
会出现临时文件。组件本身不会自动删除临时文件。
在上传完毕后,执行FileItem.delete()方法手工删除。
注意:关闭流后再删除

7、限制上传文件的类型
通过判断上传文件的扩展名来进行限制(不严格)

FileItem.getContentType():获取到MIME类型,通过这个进行过滤
图片的MIME类型都是以images开头

8、监听文件的上传进度
ServletFileUpload注册监听

9、用户没有选择文件上传时的问题

示例:

 

[java] view plain copy
 
  1. package com.upload;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8. import java.text.DateFormat;  
  9. import java.text.SimpleDateFormat;  
  10. import java.util.Date;  
  11. import java.util.List;  
  12. import java.util.UUID;  
  13.   
  14. import javax.servlet.ServletException;  
  15. import javax.servlet.http.HttpServlet;  
  16. import javax.servlet.http.HttpServletRequest;  
  17. import javax.servlet.http.HttpServletResponse;  
  18.   
  19. import org.apache.commons.fileupload.FileItem;  
  20. import org.apache.commons.fileupload.FileUploadException;  
  21. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  22. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  23.   
  24. public class UploadServlet extends HttpServlet {  
  25.   
  26.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  27.             throws ServletException, IOException {  
  28.   
  29.         DiskFileItemFactory factory = new DiskFileItemFactory();  
  30.         ServletFileUpload upload = new ServletFileUpload(factory);  
  31.   
  32.         request.setCharacterEncoding("UTF-8");  
  33.   
  34.         String inFilePath = getServletContext().getRealPath(  
  35.                 "\\WEB-INF\\upload\\");  
  36.         String dirDate = DateFormat.getDateInstance().format(new Date());  
  37.         inFilePath = inFilePath + "\\" + dirDate;  
  38.   
  39.         File file = new File(inFilePath);  
  40.   
  41.         if (!file.exists())  
  42.             file.mkdirs();  
  43.   
  44.         try {  
  45.             List<FileItem> list = upload.parseRequest(request);  
  46.   
  47.             for (FileItem item : list) {  
  48.   
  49.                 if (item.isFormField()) {  
  50.   
  51.                     String name = item.getFieldName();  
  52.                     String value = item.getString("UTF-8");  
  53.                 } else {  
  54.   
  55.                     String fileType = item.getContentType();  
  56.                     String fileName = item.getName();  
  57.   
  58.                     fileName = fileName  
  59.                             .substring(fileName.lastIndexOf("\\") + 1);  
  60.   
  61.                     OutputStream out = new FileOutputStream(inFilePath + "\\"  
  62.                             + UUID.randomUUID().toString() + "_" + fileName);  
  63.   
  64.                     InputStream in = item.getInputStream();  
  65.                     byte[] buff = new byte[1024];  
  66.                     int len = -1;  
  67.                     while ((len = in.read(buff)) != -1) {  
  68.                         out.write(buff);  
  69.                     }  
  70.                     out.close();  
  71.                     in.close();  
  72.                 }  
  73.                 System.out.println("上传完成");  
  74.             }  
  75.   
  76.         } catch (FileUploadException e) {  
  77.             throw new RuntimeException("上传失败");  
  78.         }  
  79.     }  
  80.   
  81.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  82.             throws ServletException, IOException {  
  83.   
  84.         doGet(request, response);  
  85.     }  
  86.   
  87. }  



 

四、Servlet规范中的监听

编写步骤:
a、编写一个类,实现特定的监听接口
b、在web.xml中进行注册监听
<listener>
<listener-class>com.itheima.listener.MyServletContextListener</listener-class>
</listener>

1、(3个)监听ServletContext、HttpSession、ServletRequest三个对象的创建和销毁
ServletContextListener
HttpSessionListener
ServletRequestListener

2、(3个)监听域对象中属性的增加和删除的事件监听器
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener

3、(2)感知型监听器。(不需要注册)
HttpSessionBindingListener:感知自己被绑到了HttpSession域中了
HttpSessionActivationListener:感知自己激活和钝化

分享到:
评论

相关推荐

    java 监听本地文件自动上传服务器

    结合这两个知识点,当文件夹中的文件发生变化时,你可以调用`FileUploader.uploadFile`方法将新文件或修改后的文件上传到服务器。为了实现完全自动化,你可能还需要处理错误和异常,确保在上传过程中保持文件同步的...

    图片上传进度

    这个组件可以根据需求进一步扩展,例如添加多文件上传、错误处理或服务器端的上传逻辑。 总的来说,实现“图片上传进度”功能涉及到前端技术的多个方面,包括HTML5的`&lt;input type="file"&gt;`元素的样式定制、`...

    Android-Retrofit2文件上传及其进度显示

    总结来说,Retrofit2与RxJava结合可以方便地处理文件上传,而通过自定义`RequestBody`和拦截器,可以实现文件上传的进度显示。虽然这个示例没有涉及权限管理,但在实际应用中,确保用户授权访问文件和网络是必不可少...

    jQuery监听文件上传实现进度条效果的方法

    接下来,我们可以在使用`$.ajax`方法进行文件上传时,将这个封装好的`xhrOnProgress`函数作为`xhr`选项传递进去,这样就可以在上传过程中监听进度了: ```javascript $.ajax({ url: url, type: 'POST', xhr: ...

    Netty 文件上传获取进度条

    在处理文件上传时,为了提供良好的用户体验,通常需要实现文件上传的进度条功能,让用户能够实时了解文件传输的状态。在传统的HTTP协议中,这通常依赖于JavaScript的定时轮询来实现,但这种方式效率较低且消耗资源。...

    SpringMVC文件上传,多文件上传实例

    为了提升用户体验,可以添加文件上传进度条,利用JavaScript监听上传进度并更新界面。这需要前端和后端的配合,通常通过Ajax异步请求实现。 通过上述步骤,我们可以构建一个完整的SpringMVC文件上传系统,不仅支持...

    Vuejs文件上传组件多文件上传

    在Vue.js中,实现文件上传功能是常见的需求,尤其是在构建交互丰富的Web应用时。本篇将详细介绍Vue.js中实现多文件上传的相关知识点,以及如何使用`vue-upload-component`这个开源组件来帮助我们实现这一功能。 ...

    FTP自动监听文件夹实现文件上传小程序

    该小程序是基于pyhon编制,可以自动监听指定的本地文件夹,当文件夹内出现新文件时,依据录入的ftp配置地址,实现文件自动上传FTP服务器的作用。该小程序支持同事监听两个本地文件夹,可以传输两个ftp服务器。此外,...

    Android-TNetProgress文件下载上传进度监听

    `Android-TNetProgress`项目就是为了实现这一目标,它是一个用于监听文件下载和上传进度的工具库。在OkHttp和Retrofit这两个流行的网络库上,我们可以轻松地集成`TNetProgress`来获取进度信息。 OkHttp是一个高效的...

    flash 实现的多文件上传

    在多文件上传场景中,ActionScript编写的应用程序将负责监听用户的文件选择事件,管理文件队列,并与服务器进行通信。 2. **FileReference对象**:在ActionScript 3中,FileReference是处理文件上传的核心类。它...

    文件上传下载需要的jar包 java文件上传下载

    9. **进度反馈与取消操作**: 对于用户体验,提供文件上传和下载的进度反馈以及取消操作的能力也是很重要的,这可以通过监听上传或下载的进度并更新UI来实现。 10. **文件存储策略**: 选择合适的文件存储策略,如...

    多文件上传和展示

    5. **处理上传**:你可以监听`filebatchselected`事件来在用户选择文件后执行某些操作,或者监听`fileuploaded`事件来处理单个文件上传完成后的回调。 6. **文件预览**:当用户选择文件后,Bootstrap-fileinput会...

    java编写的ftp文件实时监控下载上传

    也可以监控本地文件夹,把文件夹内新产生的文件或者文件夹整体上传到ftp服务器,上传后可删除本地文件夹内的数据。 是监控服务器还是监控本地文件夹,通过配置指定。 压缩包里是源代码和所需的jar包,还包括一个已经...

    html5文件上传插件

    4. **进度条显示**:`progress`事件可以监听文件上传进度,实时更新进度条,提高用户反馈。 5. **拖放功能**:HTML5支持文件拖放操作,用户可以直接从桌面或文件夹拖动文件到网页指定区域进行上传。 6. **跨域上传...

    有监听和过滤器,文件上传的servlet的程序

    在文件上传的场景中,监听器可能用来跟踪文件上传的统计信息,或者在用户会话结束时清理临时文件。例如,一个`SessionListener`可以用来删除用户会话中的临时文件: ```java @WebListener public class Session...

    Android文件上传,文件选择器,多选

    在Android应用开发中,文件上传和文件选择器是常见的功能需求。用户可能需要从设备存储中选择一个或多个文件,例如图片、文档或音频文件,然后上传到服务器或进行其他操作。本文将深入探讨如何在Android平台上实现...

    bootstrap 文件上传组件 fileinput 实现文件批量上传

    Bootstrap文件上传组件FileInput是一款强大的前端文件上传工具,尤其适合于需要实现文件批量上传的场景。这个组件基于Bootstrap框架,提供了美观的用户界面和丰富的功能,使得文件上传操作变得直观且易于实现。以下...

    SpringMVC+Ajax异步文件上传

    - **事件监听**:`Ajax`可以监听文件上传的进度,如开始、加载中、完成等状态,通过回调函数实时更新用户界面。 - **JSON响应**:后端处理完文件上传后,可以返回一个JSON对象,包含成功与否的信息,前端根据这个...

    spring mvc文件上传实现进度条

    在Spring MVC框架中,文件上传是一项常见的功能,而实现文件上传进度条则能提供更好的用户体验。这个场景通常涉及到前端的JavaScript或jQuery库(如jQuery File Upload)与后端的Spring MVC控制器之间的交互,以及...

    ios-轻松搞定网络实时监听、常用网络请求、上传下载文件、多图上传.zip

    【标题】"iOS网络开发详解:实时监听、网络请求、文件上传下载及多图上传" 在iOS应用开发中,网络功能是不可或缺的一部分。本资源主要围绕如何在iOS平台轻松实现网络实时监听、处理常见网络请求、文件上传下载以及...

Global site tag (gtag.js) - Google Analytics