一、servlet文件上传
1)表单的设置表单的enctype,提交方式必须为post;
<form action="up" method="post" enctype="multipart/form-data">
2)servlet3.0版本以前需要使用第三方的jar包commons-fileupload来实现上传文件,
servlet3.0版本自带了上传文件的api,无需第三方jar包!!
3) 文件存储在服务器当前项目的根目录下的upload文件夹中,
通过request.getServletContext().getRealPath()获取服务器的绝对再将上传的文件。
4) servlet3.0将上传的文件保存在Part实例中,可以通过request对象根据上传的表单控件的name获取对应的part对象,同时也支持多个文件上传;
5) 通过part对象可直接得到文件的输入流inputStream,在通过outputStream写到本地即可!
6) 可以使UUID来作为文件名,至于后缀名就需要根据上传时的文件后缀来获取了,
但是part对象里本身并没有存储上传文件的名称,我们需要从请求头信息里去获取文件名 浏览器发送上传文件请求时将文件名存储在Request Head里的Content-Disposition里;
但Content-Disposition得值里除了文件名信息还有一些其他信息:
Content-Disposition:form-data; name="file"; filename="test.txt"
二、文件上传的效果
2.1) 一个文件上传:
查看服务器的路径: E:\myjava\out\artifacts\myservlet_0326_war_exploded\upload 上传的图片
JSP页面
<form action="up.action" method="post" enctype="multipart/form-data">
照片1: <input type="file" name="myfile"><br/>
说明: <input type="text" name="content"><br/>
<input type="submit" value="上传文件">
</form>
UploadServlet代码:
protected void up(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("save !");
//输出对象
PrintWriter out = response.getWriter();
//1>上传的文件保存在Part对象
Part part =request.getPart("myfile");
//2>头信息文件 form-data; name="myfile"; filename="main.png"
String desc = part.getHeader("Content-Disposition");
//out.println(desc);
//3) 截取图片的后缀名 .png .jpg
String suffix = desc.substring(desc.lastIndexOf("."),desc.length()-1);
// out.println(suffix);
//4)随机的生存一个32的字符串
//498215e4-ab4a-4ffa-bb99-f0fda7d6d851.jpg
String fileName = UUID.randomUUID()+suffix;
// out.println(fileName);
//5)输入流对象
InputStream is = part.getInputStream();
//6)动态获取服务器的路径
String filePath = request.getServletContext().getRealPath("/upload");
//文件是否存在
File file =new File(filePath);
if(!file.exists()){
file.mkdirs(); //创建目录
}
//完整的路径
String path = filePath +"/"+fileName;
// 7)写入
FileOutputStream fos = new FileOutputStream(path);
byte[] bty = new byte[1024];
int length =0;
//文件
while ((length=is.read(bty))!=-1){
fos.write(bty,0,length);
}
//流关闭
is.close();
fos.close();
///
out.println();
//关闭
out.flush();
out.close();
}
2.2) 多个文件上传:
查看服务器的路径: E:\myjava\out\artifacts\myservlet_0326_war_exploded\upload 上传的图片
JSP页面
<form action="ups.action" method="post" enctype="multipart/form-data">
照片1: <input type="file" name="myfile"><br/>
照片2: <input type="file" name="myfile"><br/>
照片3: <input type="file" name="myfile"><br/>
<input type="submit" value="上传文件">
</form>
UploadServlet代码:
protected void ups(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//集合对象
List<String> fileNames = new LinkedList<String>();
//输出对象
PrintWriter out = response.getWriter();
//对象集合
Collection<Part> parts=request.getParts();
//遍历所有的表单内容,将表单中的文件写入上传文件目录
for (Iterator<Part> iterator=parts.iterator(); iterator.hasNext();){
//Part对象
Part part= iterator.next();
//上传的文件保存在Part对象
getFileName(request,part);
}
///
out.println();
//关闭
out.flush();
out.close();
}
/**
* 获得文件名
* @param request
* @param part
* @throws IOException
*/
private void getFileName(HttpServletRequest request,Part part) throws IOException {
//2>头信息文件 form-data; name="myfile"; filename="main.png"
String desc = part.getHeader("Content-Disposition");
//3) 截取图片的后缀名 .png .jpg
String suffix = desc.substring(desc.lastIndexOf("."),desc.length()-1);
//4)随机的生存一个32的字符串
//498215e4-ab4a-4ffa-bb99-f0fda7d6d851.jpg
String fileName = UUID.randomUUID()+suffix;
// out.println(fileName);
//5)输入流对象
InputStream is = part.getInputStream();
//6)动态获取服务器的路径
String filePath = request.getServletContext().getRealPath("/upload");
//文件是否存在
File file =new File(filePath);
if(!file.exists()){
file.mkdirs(); //创建目录
}
//完整的路径
String path = filePath +"/"+fileName;
// 7)写入
FileOutputStream fos = new FileOutputStream(path);
byte[] bty = new byte[1024];
int length =0;
//文件
while ((length=is.read(bty))!=-1){
fos.write(bty,0,length);
}
//流关闭
is.close();
fos.close();
}
三、文件下载的效果
JSP页面
<body>
<a href="down.action?fileName=d88c4317-5aa8-4384-991e-7c1757640fe0.jpg">下载图片</a>
</body>
UploadServlet 代码
protected void down(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求文件名
String str =request.getParameter("fileName");
//服务器路径(注意必须有这个文件)
String path = request.getServletContext().getRealPath("/upload")+"/"+str; //默认认为文件在当前项目的根目录
System.out.println(path);
//输入流
FileInputStream fis = new FileInputStream(path);
//响应头信息
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment; filename="+str);
//文件写入
ServletOutputStream outs = response.getOutputStream();
byte[] bt = new byte[1024];
int length = 0;
while((length=fis.read(bt))!=-1){
outs.write(bt,0,length);
}
//关闭流
outs.close();
fis.close();
}