文件上传(java web)

文件上传:

对表单的要求:

* method="post"
* enctype="multipart/form-data"
* 表单中需要添加文件表单项:<input type="file" name="xxx" />

对Servlet的要求:

* request.getParametere("xxx");这个方法在表单为enctype="multipart/form-data"时,它永远都返回null。
* ServletInputStream request.getInputStream();包含整个请求的体!

文件上传的步骤(首先需要导包-->commons-fileupload.jar和 commons-io.jar):

1. 创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory();

2. 创建解析器:ServletFileUpload sfu = new ServletFileUpload(factory);

3. 使用解析器来解析request,得到FileItem集合:List<FileItem> fileItemList = sfu.parseRequest(request);

FileItem的相关方法:

* boolean isFormField():是否为普通表单项!返回true为普通表单项,如果为false即文件表单项!
* String getFieldName():返回当前表单项的名称;
* String getString(String charset):返回表单项的值;
* String getName():返回上传的文件名称
* long getSize():返回上传文件的字节数
* InputStream getInputStream():返回上传文件对应的输入流
* void write(File destFile):把上传的文件内容保存到指定的文件中。

上传文件中Servlet中的代码实现(V1.0):

 1         request.setCharacterEncoding("utf-8");
 2         response.setContentType("text/html;charSet=utf-8");
 3
 4         /**
 5          * 文件上传3步走
 6          * 1.创建工厂
 7          * 2.创建解析器
 8          * 3.使用解析器来解析request,得到FileItem集合
 9          */
10
11         //创建工厂
12         DiskFileItemFactory factory = new DiskFileItemFactory();
13         //创建解析器
14         ServletFileUpload sfu = new ServletFileUpload(factory);
15
16         //获取FileItem集合
17         try {
18             List<FileItem> list = sfu.parseRequest(request);
19
20             FileItem fi1 = list.get(0);
21             FileItem fi2 = list.get(1);
22             String fileName = fi2.getName();
23             System.out.println("Name: "+fi2.getName());
24             System.out.println("Size: "+fi2.getSize());
25
26             File destFile = new File("d://demo",fileName); //设置存储位置
27             try {
28                 fi2.write(destFile);
29             } catch (Exception e) {
30                 // TODO Auto-generated catch block
31                 e.printStackTrace();
32             }
33         } catch (FileUploadException e) {
34             e.printStackTrace();
35         }

文件上传中需要注意的问题:

1. 文件必须保存到WEB-INF下!
* 目的是不让浏览器直接访问到

2. 文件名称相关问题
 * 有的浏览器上传的文件名是绝对路径,这需要切割!C:\files\xxx.jpg
String filename = fi2.getName();
int index = filename.lastIndexOf("\\");  //测试是否需要切割
if(index != -1) {  
filename = filename.substring(index+1);
}
* 文件名乱码或者普通表单项乱码:request.setCharacterEncoding("utf-8");因为fileupload内部会调用request.getCharacterEncoding();
> request.setCharacterEncoding("utf-8");//优先级低
> servletFileUpload.setHeaderEncoding("utf-8");//优先级高
* 文件同名问题;我们需要为每个文件添加名称前缀,这个前缀要保证不能重复。uuid

3. 目录打散
* 不能在一个目录下存放之多文件。
> 首字符打散:使用文件的首字母做为目录名称,例如:abc.txt,那么我们把文件保存到a目录下。如果a目录这时不存在,那么创建之。
> 时间打散:使用当前日期做为目录。
> 哈希打散:
* 通过文件名称得到int值,即调用hashCode()
* 它int值转换成16进制0~9, A~F
* 获取16进制的前两位用来生成目录,目录为二层!例如:1B2C3D4E5F,/1/B/保存文件。

4. 上传文件的大小限制
* 单个文件大小限制
> sfu.setFileSizeMax(100*1024):限制单个文件大小为100KB
> 上面的方法调用,必须在解析开始之前调用!
> 如果上传的文件超出限制,在parseRequest()方法执行时,会抛出异常!FileUploadBase.FileSizeLimitExceededException
* 整个请求所有数据大小限制
> sfu.setSizeMax(1024 * 1024);//限制整个表单大小为1M
> 这个方法也是必须在parseRequest()方法之前调用
> 如果上传的文件超出限制,在parseRequest()方法执行时,会抛出异常!FileUploadBase.SizeLimitExceededException

5. 缓存大小与临时目录
* 缓存大小:超出多大,才向硬盘保存!默认为10KB
* 临时目录:向硬盘的什么目录保存
设置缓存大小与临时目录:new DiskFileItemFactory(20*1024, new File("F:/temp")) //缓存为20KB,临时目录为F:/temp

时间: 2024-08-25 03:47:50

文件上传(java web)的相关文章

IOS 多文件上传 Java web端(后台) 使用List&lt;MultipartFile&gt; 接收出现的问题

先上正确的示例: 主要是设置我们的request的content-type为multipart/form-data NSDictionary *param = @{@"assignee" :self.userId, @"projectName" :itemName.text, @"proceedingName":Name.text, @"content" :content.text, @"urgency"

[转]文件上传原理:Web上传文件的原理及实现

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的CommonsFileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了CommonsFileUpload).在asp.net中也有相应的上传文件的控件. 虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理.在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件

记录: 百度webuploader 分片文件上传java服务器端(spring mvc)示例的优化

最近项目上用到文件分片上传,于是找到了百度的一个开源前端控件webuploader. 于是尝试使用. 下载下来后,它提供的服务器端示例代码是php版的,那么Java版的呢? 其实,上传文件都是按照rfc1867标注来的, 只是分段上传需要在前端多做点事情.分段上传原理其实就是在前端使用JavaScript对文件进行分割成不同小块,然后每次ajax请求就post一小块,直到全部收到为止. 但是,为了确保后端能判断文件是否完整的收到,需要得知当前是第几块,一共多少块,每个分段的大小是多少(前后端同学

前后端分离跨服务器文件上传-Java SpringMVC版

近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一份Tomcat,用来作为文件服务器 1.1 xml文件: 需要在该Tomcat的conf目录下的web.xml文件的大概100行添加如下部分: 1.2 server.xml文件: 需要在该Tomcat的conf目录下的server.xml文件做一些端口的修改 1.3 Tomcat下建立文件夹 在该T

jquery-ajax实现文件上传异常处理web.multipart.MultipartException

异常如下: org.springframework.web.multipart.MultipartException: The current request is not a multipart request 原因分析: 可能原因1: form表单中没有添加 enctype="multipart/form-data" 属性 可能原因2: 请求方式必须为post,如果不是则必定出错 可能原因3: 请求的contentType不是"multipart/form-data&qu

以调用接口的方式将文件上传至Web服务器

前台代码: <form id="form1" action="http://www.abc.com/data/UploadFile.aspx" method="post" enctype="multipart/form-data" > <input type="file" name="F" style="width:160px;" /> <

Selenium的文件上传JAVA脚本

在写文件上传脚本的时候,遇到了很多问题,包括元素定位,以及上传操作,现在总结下来以下几点: 1. 上传的控件定位要准确,必要时要进行等待 WebElement adFileUpload = driver.findElement(By.xpath("//input[@type='file']")); 2. 上传操作 String filePath ="D:\\taxonomy\\DB\\HaierTaxonomy.xlsx"; adFileUpload.sendKey

Web应用安全之文件上传漏洞详解

什么是文件上传漏洞 文件上传漏洞是在用户上传了一个可执行的脚本文件,本通过此脚本文件获得了执行服务器端命令的功能,这种攻击方式是最为直接,最为有效的,有时候,几乎没有什么门槛,也就是任何人都可以进行这样的攻击.文件上传为什么会是漏洞呢?文件上传本身是没有问题的,问题是文件上传后看服务器怎么来处理,怎么来解析这个文件.如果说服务器处理的模式不够安全,那么就会导致严重的后果,也就是上传了恶意的可执行文件以后,服务器端对此文件进行执行. 文件上传后导致的安全问题 上传的文件是web脚本语言,服务器的w

C#实现Web文件上传的两种方法

1. C#实现Web文件的上传 在Web编程中,我们常需要把一些本地文件上传到Web服务器上,上传后,用户可以通过浏览器方便地浏览这些文件,应用十分广泛. 那么使用C#如何实现文件上传的功能呢?下面笔者简要介绍一下. 首先,在你的Visual C# web project 中增加一个上传用的Web Form,为了要上传文件,需要在ToolBox中选择HTML类的File Field控件,将此控件加入到Web Form中,然而此时该控件还不是服务端控件,我们需要为它加上如下一段代码:<input