一、文件上传
1.文件上传对表单的要求
<body>
<!-- 文件上传对表单的要求
1.请求提交方式必须是post
2.表单中应指定所提交的请求为multipart请求
3.在form表单中添加enctype属性,其值为multipart/form-data
4.表单元素要有file
-->
<form action="${pageContext.request.contextPath }/photo" method="post" enctype="multipart/form-data">
照片:<input type="file" name="photo" />
<br>
<input type="submit" value="提交" />
</form>
</body>
2.手工接收上传的文件
package Servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Photo extends HttpServlet
{
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//以输入流的形式获取multipart请求的请求体
ServletInputStream inputStream = request.getInputStream();
//将输入流的数据写入到标准输出流
PrintWriter out = response.getWriter();
int len = -1;
byte[] buffer = new byte[1024];
while((len = inputStream.read(buffer)) != -1)
{
String s = new String(buffer,0,len);
out.print(s);
}
//关闭输入流
inputStream.close();
}
}
3.引入Jar包接收上传的文件
在这里需要引入两个jar包:commons-fileupload-1.4.jar和commons-io-2.8.0.jar
下面演示的是最简单的接收形式,既没有对上传文件的大小进行限制,也没有设置文件临时目录
package Servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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;
public class Photo extends HttpServlet
{
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//判断是否是multipart请求
if(!ServletFileUpload.isMultipartContent(request))
{
throw new RuntimeException("当前请求不支持文件上传");
}
try
{
//创建一个FileItem工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建文件上传核心组件
ServletFileUpload upload = new ServletFileUpload(factory);
//解析请求,获取到所有的Item
List<FileItem> formItems = upload.parseRequest(request);
//遍历Items
for (FileItem item : formItems)
{
//如果item是普通表单项(不是多媒体)
if(item.isFormField())
{
//获取表单项名称
String fieldName = item.getFieldName();
//获取表单项的值
String fieldValue = item.getString();
System.out.println(fieldName + " = " + fieldValue);
}
//若item为文件表单项
else
{
//获取文件名
String fileName = new File(item.getName()).getName();
//获取输入流,其中有上传文件的内容
InputStream is = item.getInputStream();
//获取文件保存在服务器的路径
String path = this.getServletContext().getRealPath("/image");
//创建目标文件
File f = new File(path,fileName);
//创建文件输出流
OutputStream os = new FileOutputStream(f);
//将输入流中的数据写入到输出流中
int len = -1;
byte[] buffer = new byte[1024];
while((len = is.read(buffer)) != -1)
{
os.write(buffer, 0, len);
}
//关闭流
os.close();
is.close();
}
}
}
catch (FileUploadException e)
{
e.printStackTrace();
}
}
}
二、文件下载
1.直接以超链接形式下载
缺点:能被浏览器解析的文件会直接在网页上打开,不会以附件形式下载
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Download</title>
</head>
<body>
<!--以超链接形式下载文件-->
<a href="${pageContext.request.contextPath }/resource/abc.txt">abc.txt</a>
<br>
<a href="${pageContext.request.contextPath }/resource/jstl.jar">jstl.jar</a>
</body>
</html>
2.Servlet方式的文件下载
注意:文件名中文乱码问题
package Servlet;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownLoad extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//解决文件名的中文乱码问题
String filename = "你好.txt";
//按照当前字符集打散
byte[] bytes = filename.getBytes("UTF-8");
//按照目标编码进行组装
filename = new String(bytes,"ISO8859-1");
//修改相应的头部属性content-disposition的值为attachment并设置文件名
response.setHeader("content-disposition", "attachment;filename=" + filename );
//获取连接服务器资源文件的输入流
InputStream is = this.getServletContext().getResourceAsStream("/resource/abc.txt");
//获取输出流
ServletOutputStream os = response.getOutputStream();
//将输入流中的数据写入到输出流
int len = -1;
byte[] buffer = new byte[1024];
while((len = is.read(buffer)) != -1)
{
os.write(buffer, 0, len);
}
//关闭流
os.close();
is.close();
}
}