java⽂件的上传和下载(细节问题)⼀: ⽂件的上传:
要求:
1:jsp的页⾯:
a: form 表单:
b: post 提交:
c: form指定⼀个属性: enctype="multipart/form-data"
d: file组件:
2: Servlet:
ServletInputStream in = InputStream();
获得数据, 被封装了in 当中, 理论上可以解析数据。
3: request 请求体当中:
post请求体:
请求⾸⾏:
请求头信息:
请求体:
-------------------
普通组件: 只有⼀个头: Content-Dispositon: name="xxx"
请求体: mrzhang : 填写的内容。
-------------------
⽂件上传字段: 两个头:
Content-Disposition: form-data; name="file"; filename="C:\Users\Mrzhang\" Content-Type: text/plain MIME
⽂件上传的内容:
xxxx
-----------
⼆: 解析request当中的请求体:
1:jar: Apache组织提供的⼀个公共组件:
commons-fileupload
commons-io
和⽂件上传相关的两个组件, 这两个组件是强依赖。
2:原理:
把request请求体当中的每⼀个组件的内容都封装到了⼀个对象当中:
FileItem对象: 使⽤对象的⽅法和属性来获得数据。
3:获得FileItem:
a: 获得⼯⼚:
b: 获得解析器:
c: 使⽤解析器解析request,得到fileItme 对象:
对象的代码:
c语言入门教程非常详细// 获得⼯⼚:
DiskFileItemFactory Factory = new DiskFileItemFactory();
//获得解析器:
ServletFileUpload upload = new ServletFileUpload(Factory);
// 解析request,获得所有的FileItem对象:
List<FileItem> list= upload.parseRequest(request);
4: FileItem 类的详解:
isFormField() 判断组件是⼀个普通组件还是⼀个⽂件上传组件: true,普通组件:false: ⽂件上传组件: getFieldName() 返回普通字段属性的值。 name= username 获得是username的值:
getString(); 获得普通字段上传的内容。
⽂件上传组件:
getName();获得⽂件的名称:
getSize();会的⽂件上传的字节⼤⼩。 long
getInputStream();获得⽂件上传对应的流:
write(File file) ; ⽂件的内容写到指定的位置:
三: ⽂件上传的具体代码;
(1)引⼊jar包:
(2)准备页⾯:
(3)准备Servlet:
四: 细节:
1:上传的普通字段的内容: 乱码: getString("utf-8");
2:上传的⽂件不能被外界直接访问, 应该隐藏起来: ⽬的,安全;
应该吧⽂件上传到web-inf下,内容不能被外界直接访问。
获得为web-inf/files的位置: 在tomcat上真实的位置:
3: ⽂件的的⽂件的路径问题:
不同的浏览器上传的路径不⼀致。 有的浏览器上传的上传相对路径, 有的浏览器上传的是绝对路径。 ⼤部分浏览器上传的相对路径。
<
c:\user\mrzhang\
截取出⽂件的名称:
String filename = f2.getName();
//截取:
int index = filename.lastIndexOf("\\");
if(index!=-1){
filename = filename.subString(index+1);
}
4: 上传⽂件的名称乱码问题:
request.setCharacterEncoding("utf-8");
解析器当中提供了⼀个⽅法:
servletFileUpload.setHeaderEncoding("utf-8");// 解析器提供。优先级⾼: 对 request.setCharacterEncoding("utf-8");的封装5: ⽂件同名的问题:
解决⽅式⼀: uuid+"filename".后缀名称;
解决⽅式⼆: new Date().getTime()+"filename";
6: 上传的⽂件不能存在同⼀个⽬录下 : 上传的⽬录打散:
a: 时间打散: 获得当前的时间, 创造⽬录:
b: ⽂件名称⾸字母打散: : charAt("0")
c: 哈希打散:
实现步骤:
(1) 获得⽂件名称:
(2)获得哈希值: hashCode(); int
(3)转换成⼗六进制: HexString(); //字符串: 9A8B7C
java下载过程(4) 获得字符串的前两个: 第⼀个字母做第⼀层⽬录。 第⼆个字母做第⼆层⽬录。 16*16
package com.yidongxueyuan.web.servlet;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apachemons.fileupload.FileItem;
import org.apachemons.fileupload.FileUploadException;
import org.apachemons.fileupload.disk.DiskFileItemFactory;
import org.apachemons.fileupload.servlet.ServletFileUpload;
/*
* 处理⽂件上传的servlet:
*
* 1:细节:
* 乱码解决了⽂件名称上传的乱码,
* 普通字段: getString("utf-8");
* 2:对相对路径进⾏了处理: subString();
*
* 3: ⽂件名称同名的问题,处理:delimiter在python
*
* 4:哈希打散:
* filename.hashCode();
* HexString();
* filename.charAt(0);
*
* File dir= new File(root, charAt(0)+"\"+charAt(1));
*
* File destFile = new File(dir, savefilename);
*
* write();
*
*
*
*
*/
public class FileUploadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//解决上传⽂件名称的乱码问题:
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");//告知客户端浏览器响应的内容: text/html charset=utf-8
怎样学好计算机编程汇编程序例子/*
* 三步⾛:
* 1:获得⼯⼚:
* 2:获得解析器:
* 3:解析request:
*/
//获得获得解析器⼯⼚;
DiskFileItemFactory factory = new DiskFileItemFactory(1024*20,new File("C:/Users/Mrzhang/javaEE/javaEE-07/temp")); // DiskFileItemFactory factory = new DiskFileItemFactory();
//获得解析器:
ServletFileUpload upload = new ServletFileUpload(factory);
//解析之前设置上传单个⽂件的⼤⼩:
// upload.setFileSizeMax(1024*10);//这是最⼤是10K:
// upload.setSizeMax(1024*1024*10); //设置了整个request 的⼤⼩,如果上传的request ⼤于设定的最⼤值,也会触发异常
//解析request:获List<FileItem>
try {
List<FileItem> fileItem = upload.parseRequest(request);
//解析fileItem当中的内容: web-inf下的:⽬录安全:不能被外界随机的访问:
FileItem f2 = (1);//⽂件上传的组件:
/*
* 获得⽂件的名称:
* f2.getName();
* f2.getInputStream(); ⽂件当中的内容:
* new FileOutputStream("path");
* 实现流对接:
*/
/*
* 获得要保存的路径:
* WEB-INF/files/
* ⽬的:安全:不能被外界直接通过浏览器访问:
c语言设计谭浩强* 获得ServletContext对象:获得真实路径:
String root = ServletContext().getRealPath("/WEB-INF/files/");
//获得上传⽂件的名称:
String filename = f2.getName();
/
*
* 细节的处理:
* 1:绝对路径的问题:兼顾⼩部分浏览器:
*/
int index = filename.lastIndexOf("\\");
if(index != -1){//说明路径当中存在\\ :
filename = filename.substring(index+1);
}
/*
* 处理⽂件同名的问题: uuid
*/
String savename = CommonsUtils.uuid()+"_"+filename;
/*
* 哈希码⽣产多个⽬录:将上传的⽂件存放在多个⽬录当中:
*/
// 1:获得⽂件名称的哈希值:
int code = filename.hashCode();// int
// 2:获得code 的⼗六进制的值:
String hex = HexString(code);// 9c0a1d
// 获得前两位:充当第⼀层⽬录和第⼆层⽬录:
char firstDir = hex.charAt(0);
char secDir = hex.charAt(1);
/
*
* 获得保存的⽂件路径:
*/
File dirFile = new File(root, firstDir+"/"+secDir);//存放的⽬录:
//dirFile 如果不存在,创建:
if(!ists()){//说明不存在
//创建“:
dirFile.mkdirs();//创建多层的⽬录:
}
//创建保存的⽂件:
File destFile = new File(dirFile, savename);
/
/保存:
try {
f2.write(destFile);
} catch (Exception e) {
e.printStackTrace();
}
} catch (FileUploadException e) {
// 触发异常:说明⽂件过⼤:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论