一、文件上传
依赖jar包:
comments-fileupload.jar comments-io.jar
1、form表单属性enctype="multipart/form-data" method=“post”;
2、请求编码、响应编码设置;
3、解析request对象3步骤
创建工厂类:FileItemFactory factory=DisFileItemFactory();
创建解析器:ServletFileUpload upload = new ServletFileUpload(factory);
使用解析器解析request对象: List<FileItem> items = upload.parseRequest(request);
4、限制元素(置于解析器解析之前)
①upload.setFileSizeMax(1024*n); 限制所有文件上传的大小
②upload.setSizeMax(1024*n); 限制单个文件上传的大小
③upload.setHeaderEncoding("utf-8"); 设置上传的中文格式
5、FileItem对象相关方法
①String itemName = item.getFieldName() ; 获取表单项的name值
②boolean isFormField() ; 判断是否是普通表单字段(true/false)-- 即普通字段text等与文件file的区别
③String getString("编码设置") ; 获取字段内容,普通字段--value值 文件字段--文件内容
④String getContextType():获取上传文件类型 text/image,如果是普通字段,则返回null 也可以通过文件名字符串中后缀来实现上传文件类型限制;
⑥long getSize(1024*n): 获取字段内容大小,单位字节byte
⑦InputStream getInputStream():获取文件内容的输入流,如果是普通字段,则返回value的输入值
6、获取表单数据(文字、文件...)
①定义接收变量
②迭代器/for循环变量item取值
items用法: items.next()返回boolean
whie(items.next()){
FileItem item = items.next();
String itemName = item.getFieldName();//获取name
var var = -1/null/...
if(item.isFormField()){
if(equals判断name){
var = item.getString("utf-8");//接受符合name的value
}else if(...){
...
}eles{
其他字段
}
}else{
String fileName = item.getName();获取文件名
文件相关操作
}
}
7、文件相关操作
(1)获取路径字符串
①String path = "xxxx"; //静态指定路径
②String path = request.getSession().getServletContext().getRealPath("upload")//动态获取tomcat下项目路径
③File dir = new File("路径+项目名("d:/upload")");//自行创建目录
if(!dir.exists()){
dir.mkdirs(); //不存在则创建
}
(2)获取文件名(包含后缀)
String fileName = item.getName();
处理文件重名导致覆盖问题----UUID类
UUID uuid = UUID.randomUUID();
String uuidName = uuid.toString()+fileName.substring(fileName.lastIndexOf("."));
③存储文件方式(路径位置与文件名字)
File file = new File(路径,文件名) 路径:path/dir 文件名:fileName/uuidName;
④文件上传(item实际上就是获取的文件内容)
item.write(file);
简单示例:
<form action="uploadServlet" enctype="multipart/form-data" method="post">
文件编号:<input type="text" name="fno"/>
文件:<input type="file" name="file"/>
</form>
//设置编码格式
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");
Iterator<FileItem> iter = items.iterator();// 通过迭代器便利List元素
while (iter.hasNext()) {
FileItem item = iter.next();
if (item.isFormField()) {
// type=表单属性
String itemName = item.getFieldName();
String fno = "";
if (itemName.equals("fno")) {
fno = item.getString();//获取name为fno的属性值
System.out.println("fno属性值:" + fno);
} else {
System.out.println("其他属性字段...");
}
} else {
// type=file
System.out.println("xxx");
String fileName = item.getName();// 获取文件名
File dir = new File("D:/testDir");// 文件存储目录,无则创建
if (!(dir.exists())) {
dir.mkdirs();
}
File file = new File(dir, fileName);
item.write(file);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} else {
// 不是文件表单
System.out.println("非文件表单...");
}
二、文件下载
依赖jar包: 无
1、通过<a href=""></a>或者form表单进行文件下载----获取下载文件名
<form action="downloadServlet" method="post">
文件名:<input type="text" name="fname"/><br>
<input type="submit" value="下载"/><br>
</form>
<a href="downloadServlet?fname=1234.docx">下载文件名为1234.docx的文件</a>
2、downloadServlet中配置响应信息头
response.addHeader("content-Type", "application/octet-stream");
response.addHeader("content-Disposition", "attachment;filename=" + fname);
不同浏览器下载文件名乱码问题:
不过本人测试得,即使设置为:URLEncoder.encode(fname, "utf-8"),在火狐上下载也不会乱码。
String agent = request.getHeader("User-Agent");
if (agent.toLowerCase().indexOf("firefox") != -1) {
System.out.println("火狐设置");
response.addHeader("content-Disposition", "attachment;filename==?UTF-8?B?"
+ new String(Base64.encodeBase64(fname.getBytes("utf-8")) + "?="));
} else {
System.out.println("非火狐设置:" + agent);
response.addHeader("content-Disposition", "attachment;filename=" + URLEncoder.encode(fname, "utf-8"));
}
3、获取下载文件的路径
String path = "D:/testDir/" + fname;
4、通过IO操作将文件转换为输入输出流
InputStream in = new FileInputStream(path);//将对应目录文件转换为输入流
/*
* 文件在项目目录中
* InputStream in = getServletContext().getResourceAsStream("/ServletDir/" + fname);
*/
ServletOutputStream out = response.getOutputStream();
byte[] chs = new byte[100];
int len = -1;
while ((len = in.read(chs)) != -1) {
out.write(chs, 0, len);
}
//关闭流
out.close();
in.close();
简单示例:
<form action="downloadServlet" method="post">
文件名:<input type="text" name="fname"/><br>
<input type="submit" value="下载"/><br>
</form>
<a href="downloadServlet?fname=1234.docx">下载文件名为1234.docx的文件</a>
// 响应头
String fname = request.getParameter("fname");
response.addHeader("content-Type", "application/octet-stream");
// response.addHeader("content-Disposition", "attachment;filename=" + fname);
String agent = request.getHeader("User-Agent");
if (agent.toLowerCase().indexOf("firefox") != -1) {
System.out.println("火狐设置");
response.addHeader("content-Disposition", "attachment;filename==?UTF-8?B?"
+ new String(Base64.encodeBase64(file.getFname().getBytes("utf-8")) + "?="));
} else {
System.out.println("非火狐设置:" + agent);
response.addHeader("content-Disposition", "attachment;filename=" + URLEncoder.encode(fname, "utf-8"));
}
String path = "D:/testDir/" + fname;
System.out.println(path);
InputStream in = new FileInputStream(path);
// InputStream in = getServletContext().getResourceAsStream("/ServletDir/"+fname);
// OutputStream out = new FileOutputStream();
ServletOutputStream out = response.getOutputStream();
byte[] chs = new byte[100];
int len = -1;
while ((len = in.read(chs)) != -1) {
out.write(chs, 0, len);
}
out.close();
in.close();