文件上传:
文件上传在特定的页面需求中有所特定,一般的开发步骤:
1)在提供上传的特定页面中,表单的包含<input type="file" />
2)表单提交必须使用POST方式提交
3)修改表单的enctype属性,用于修改content-type,影响请求正文的内容,当一个页面有了文件上传的属性以后,普通表单的数据也会变成正文内容,不是键值对了
修改为:enctype="multipart/form-data"
解析文件上传:
1)创建DiskFileItemFactory对象,用于设置缓存配置
2)创建ServletFileUpload对象,用于解析文件
List<FileItem> parseRequest(request) 用于解析所有上传的文件内容
FileItem:代表的是一个上传的文件相关信息
getName() 获取文件的名称
getContentType() 获取文件的类型
getSize() 获取文件的大小
getInputStream() 获取的是文件的内容
3)使用FileUtils的copyXXX方法把数据写出
文件的下载
1)读取所需要下载的文件路径
2)通知浏览器提示一个下载框,设置响应头:content-disposition 为 attachment;filename=XXX
3)在把文件的内容输出
这两个功能也算是Servlet技术的辅助功能,在一些特定的需求下可以使用
文件上传在特定的页面需求中有所特定,一般的开发步骤:
1)在提供上传的特定页面中,表单的包含<input type="file" />
2)表单提交必须使用POST方式提交
3)修改表单的enctype属性,用于修改content-type,影响请求正文的内容,当一个页面有了文件上传的属性以后,普通表单的数据也会变成正文内容,不是键值对了
修改为:enctype="multipart/form-data"
解析文件上传:
1)创建DiskFileItemFactory对象,用于设置缓存配置
2)创建ServletFileUpload对象,用于解析文件
List<FileItem> parseRequest(request) 用于解析所有上传的文件内容
FileItem:代表的是一个上传的文件相关信息
getName() 获取文件的名称
getContentType() 获取文件的类型
getSize() 获取文件的大小
getInputStream() 获取的是文件的内容
3)使用FileUtils的copyXXX方法把数据写出
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.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
public class demo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//在文件的上传中,首先创建DiskFileItemFactory对象,可以无参,也可以有参
/*
* 也可以创建DiskFileItemFactory有参的对象,表示创建带内存大小的缓存配置,
* 参数一:表示设置的缓存打下
* 参数二:表示超过缓存时存入的文件
*/
//DiskFileItemFactory ds = new DiskFileItemFactory();
DiskFileItemFactory ds = new DiskFileItemFactory(1*1024*1024,new File("c:/"));
//创建ServletFileUpload对象,传入DiskFileItemFactory对象
ServletFileUpload sfu = new ServletFileUpload(ds);
try {
//在ServletFileUpload对象的parseRequest能够得到FileItem的数据,里面包括文件也包括其他的数据
List<FileItem> items = sfu.parseRequest(request);
/*得到一个文件上传的内容
* FileItem item = items.get(0);
System.out.println(item.getName());
System.out.println(item.getContentType());
System.out.println(item.getSize());*/
//遍历得到所有需要提交的数据
for(FileItem item1 : items){
System.out.println(item1.getName());
System.out.println(item1.getContentType());
System.out.println(item1.getSize());
FileUtils.copyInputStreamToFile(item1.getInputStream(), new File("c:/"));
//写完以后再缓存区中删除缓存数据
item1.delete();
}
//把文件上传的数据通过变成字节码文件,写到第二参数的位置
//FileUtils.copyInputStreamToFile(item.getInputStream(), new File("c:/"));
} catch (FileUploadException e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
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.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
public class demo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
DiskFileItemFactory ds = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(ds);
sfu.setFileSizeMax(2*1024*1024); //表示一个文件上传的最大值
sfu.setSizeMax(4*1024*1024); //表示文件一次性上传的最大值
try{
List<FileItem> items = sfu.parseRequest(request);
if(items != null && items.equals("")){
for(FileItem item : items){
if(item.isFormField()){ //判断是否为普通表单的数据,普通表单数据通过getString方法输出
System.out.println(item.getString("utf-8"));
}else{
/**
* 限制文件类型
*/
String contentType = item.getContentType();
//只能上传图片: image/xxxx
if(!contentType.matches("image/[a-zA-Z0-9]+")){
//不允许的类型
request.setAttribute("msg", "不支持该类型:"+contentType);
request.getRequestDispatcher("/upload3.jsp").forward(request, response);
return;
}
System.out.println(item.getName());
System.out.println(item.getContentType());
System.out.println(item.getInputStream());
FileUtils.copyInputStreamToFile(item.getInputStream(), new File("c:/"));
}
}
}
}catch(FileSizeLimitExceededException e){
request.setAttribute("msg", "每个文件不能超过200kb大小");
request.getRequestDispatcher("/upload.jsp").forward(request, response);
return;
}catch(SizeLimitExceededException e){
request.setAttribute("msg", "一次性的总文件不能超过400kb大小");
request.getRequestDispatcher("/upload.jsp").forward(request, response);
return;
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'demo3.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="<c:url value='/demo3' />" method="post" enctype="multipart/form-data">
文件上传:<input type="file" name="attach" />
<br /><input type="submit" value="上传" />
</form>
</body>
</html>
文件的下载
1)读取所需要下载的文件路径
2)通知浏览器提示一个下载框,设置响应头:content-disposition 为 attachment;filename=XXX
3)在把文件的内容输出
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//文件 的下载
public class demo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//首先得到文件的路径
String path = this.getServletContext().getRealPath("/images/1.jpg");
File file = new File(path);
FileInputStream in = new FileInputStream(file);
//在设置响应头为下载
response.setHeader("content-disposition", "attachment;filename="+file.getName());
//然后在浏览器弹出下载框进行下载
OutputStream out = response.getOutputStream();
byte[] b = new byte[1024];
int len = 0;
while((len = in.read())!= -1 ){
out.write(b, 0, len);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
这两个功能也算是Servlet技术的辅助功能,在一些特定的需求下可以使用