文件上传
1.文件上传三要素
1)表单提交方式为post
2)表单中需要有<input type=”file”>元素,需要有name属性和值。
3)表单中设置enctype=”multipart/form-data”
<h1>文件上传</h1>
<form action="" method="post" enctype="multipart/form-data">
文件描述:<input type="text" name="info"><br />
文件上传:<input type="file" name="upload"><br /> <input type="submit" value="上传" />
</form>
2.导入fileupload的jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
3.编写文件上传的servlet(在wabapp下创建好upload文件夹)
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
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 FileUploadServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
//创建文件磁盘工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//创建Servlet解析类
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
try {
//获取request的请求(包括普通项和文件上传项)
List<FileItem> list = fileUpload.parseRequest(request);
//遍历集合
for (FileItem fileItem : list) {
//判断是否为表单项(即非文件上传项)
if (fileItem.isFormField()) {
//获取参数名
String ParameterName = fileItem.getFieldName();
//获取参数值
String ParameterValue = fileItem.getString("UTF-8");
System.out.println(ParameterName + " : " + ParameterValue);
} else {//是文件上传项
//获取文件名
String fileName = fileItem.getName();
//获取文件内容
InputStream fileContent = fileItem.getInputStream();
//将文件内容写入磁盘
String realPath = getServletContext().getRealPath("/upload");//获取要传入文件夹磁盘的绝对路径
OutputStream os = new FileOutputStream(realPath + "/" + fileName);
int len = 0;
byte[] b = new byte[1024];
while ((len = fileContent.read(b)) != -1) {
os.write(b, 0, len);
}
fileContent.close();
os.close();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
doGet(request, response);
}
4.在web.xml文件中配置servlet,并设置好请求路径
<servlet>
<description></description>
<display-name>FileUploadServlet</display-name>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>com.cz.servlet.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/FileUploadServlet</url-pattern>
</servlet-mapping>
5.运行工程,上传文件,如图效果
看到控制台结果如下
刷新工程,upload路径下多了一个文件
文件下载
文件下载有两种方式:
1.通过超链接下载:<a href=”资源路径”></a>,但是如果浏览器支持显示这种数据格式就不会提示下载了
2.通过代码的方式实现文件下载,主要是要设置两个头,并且使用response对象的getOutputStream()获取
输出流向客户端写数据。
Content-Type :文件的MIME的类型
Content-Disposition :浏览器支持该格式的文件,提示下载
下面是通过代码方式实现文件下载:
public class FileDownload extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.接收参数:
String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"), "UTF-8");
// 2.下载:设置两个头和一个流
// 设置Content-Type
String type = getServletContext().getMimeType(filename);
response.setContentType(type);
// 定义一个代表该文件的路径:
String path = getServletContext().getRealPath("/download");
File file = new File(path + "/" + filename);
// 判断浏览器的类型:
String agent = request.getHeader("User-Agent");
if (agent.contains("Firefox")) {
// 使用的是Firefox
filename = DownloadUtils.base64EncodeFileName(filename);
} else {
// IE或者其他的浏览器
filename = URLEncoder.encode(filename, "UTF-8");
}
// 设置Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
// 设置一个代表了文件的输入流
InputStream is = new FileInputStream(file);
OutputStream os = response.getOutputStream();
// 两个流对接:
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b)) != -1) {
os.write(b, 0, len);
}
is.close();
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
配置servlet
<servlet>
<description></description>
<display-name>FileDownloadServlet</display-name>
<servlet-name>FileDownloadServlet</servlet-name>
<servlet-class>com.cz.servlet.FileDownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileDownloadServlet</servlet-name>
<url-pattern>/FileDownloadServlet</url-pattern>
</servlet-mapping>
启动工程,前端发送.../FileDownloadServlet?filename=xxx.jpg就可以了