一、文件上传
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、用户没有选择文件上传时的问题
示例:
- package com.upload;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.List;
- import java.util.UUID;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.fileupload.FileItem;
- import org.apache.commons.fileupload.FileUploadException;
- import org.apache.commons.fileupload.disk.DiskFileItemFactory;
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
- public class UploadServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- DiskFileItemFactory factory = new DiskFileItemFactory();
- ServletFileUpload upload = new ServletFileUpload(factory);
- request.setCharacterEncoding("UTF-8");
- String inFilePath = getServletContext().getRealPath(
- "\\WEB-INF\\upload\\");
- String dirDate = DateFormat.getDateInstance().format(new Date());
- inFilePath = inFilePath + "\\" + dirDate;
- File file = new File(inFilePath);
- if (!file.exists())
- file.mkdirs();
- try {
- List<FileItem> list = upload.parseRequest(request);
- for (FileItem item : list) {
- if (item.isFormField()) {
- String name = item.getFieldName();
- String value = item.getString("UTF-8");
- } else {
- String fileType = item.getContentType();
- String fileName = item.getName();
- fileName = fileName
- .substring(fileName.lastIndexOf("\\") + 1);
- OutputStream out = new FileOutputStream(inFilePath + "\\"
- + UUID.randomUUID().toString() + "_" + fileName);
- InputStream in = item.getInputStream();
- byte[] buff = new byte[1024];
- int len = -1;
- while ((len = in.read(buff)) != -1) {
- out.write(buff);
- }
- out.close();
- in.close();
- }
- System.out.println("上传完成");
- }
- } catch (FileUploadException e) {
- throw new RuntimeException("上传失败");
- }
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
四、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:感知自己激活和钝化
相关推荐
1.JAVA 监听文件夹变化 2.模拟POST提交文件流同步服务器文件
1.去除默认的样式; 2.使用上传可以查看上传进度(本博做的是上传的百分比,做成进度圆圈类似); 3.图片从本地选择上传后预览图片;
Retrofit2 文件上传及其进度显示 只涉及 Retrofit RxJava 上传文件,像权限管理没有出来,毕竟只是演示多文件上传,显示进度
也可以监控本地文件夹,把文件夹内新产生的文件或者文件夹整体上传到ftp服务器,上传后可删除本地文件夹内的数据。 是监控服务器还是监控本地文件夹,通过配置指定。 压缩包里是源代码和所需的jar包,还包括一个已经...
基于java语言实现文件的本地上传,oss普通上传,和大文件的分段上传,请手写的,可以使用,可以上传图片,视频压缩包等多种格式文件
该小程序是基于pyhon编制,可以自动监听指定的本地文件夹,当文件夹内出现新文件时,依据录入的ftp配置地址,实现文件自动上传FTP服务器的作用。该小程序支持同事监听两个本地文件夹,可以传输两个ftp服务器。此外,...
下面小编就为大家带来一篇jQuery监听文件上传实现进度条效果的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
spring mvc文件上传,通过监听器实现进度条
servlet实现文件上传的时候,当文件较大的时候,会有文件上传的进度条提示,使用的原理是使用jquery的异步请求,在jsp页面设置定时器,每隔一段时间获取文件上传监听器同步到session中的最新的上传信息。
支持模块加载和卸载,其中upload_module和upload_progress_module就是第三方开发的模块,并没有加入到Nginx的源码中,upload_module是上传文件到服务器的模块,upload_progress_module是监听和报告文件上传进度模块...
有监听和过滤器,文件上传的servlet的程序
通过netty获取文件进度,上传文件的时时数据大小,剩余时间.websocket和HTML结合,并不javascript的轮询获取上传进度,而是通过NIO的推送.
通过面向对象的方式实现一个文件上传预览的组件,该组件利用FileReader来实现文件在前端的解析,预览,读取进度等功能,并对外暴露相应api来实现用户自定义的需求,比如文件上传,进度监听,自定义样式,读取成功回...
会出现IE响应很慢的情况,如果用户急性子,多点几下上传的按钮,那么就会导致IE不响应的情况,这个时候如果在文件上传得过程中,给用户一个动态的提示甚至是一个上传的进度条,效果就会好多了,这样就会用到Ajax技术...
Ajax 文件上传进度监听之upload.onprogress案例详解 $.ajax实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> , initial-scale=1.0" /> ...
本文中主要陈述一种实时监听文件夹中是否有文件增加的功能,可用于实际文件上传功能的开发。本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
无论okhttp还是retrofit方式,只需要在oKhttpClient的构建者对象中添加拦截器即可.
VS.NET C#监听txt文件修改,上传设备操作日志数据到软件查询系统
文件上传如果加上进度条会有更好的用户体验(尤其是中大型文件),本文使用 Nodejs 配合前端完成这个功能。 前端我们使用 FormData 来作为载体发送数据。 效果 前端部分 HTML 部分 和 Js 部分 <input type=...
试试监听文件夹下的文件修改,通过数据库或URL上传SPC