一、文件上传
1.导入jar包:commons-fileupload.jar,commons-io.jar
2.上传文件的页面 register.jsp
- enctype=“multipart/form-data” 表示提交的数据种包含二进制数据,必填
- <input type=“file” name=“myFile” /(>) 文件表单
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="uname"/><br/>
密码:<input type="password" name="pass"/><br/>
上传头像:<input type="file" name="myFile" /><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
3. 上传Servlet UploadServlet.java
package org.lanqiao.servlet;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class UploadServlet
*/
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/**
* 处理文件上传
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置字符集
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//声明文件名
String fileName="";
//声明上传的路径
String uploadPath=request.getServletContext().getRealPath("upload");
System.out.println("要上传的路径是:"+uploadPath);
//判断form表单请求提交的类型(encType)
boolean isMultipart=ServletFileUpload.isMultipartContent(request);
if(isMultipart) { //如果是混合表单
FileItemFactory factory=new DiskFileItemFactory();
//使用工厂对象创建ServletUpload
ServletFileUpload upload=new ServletFileUpload(factory);
try {
String name="";
String pass="";
//解析用户的表单
List<FileItem> fileItems=upload.parseRequest(request);
for (FileItem fileItem : fileItems) {
boolean isField=fileItem.isFormField(); //判断是普通表单还是附件表单
if(isField) { //如果是普通表单
String fieldName=fileItem.getFieldName();
if("uname".equals(fieldName)) {
name=fileItem.getString("utf-8"); //获取用户名
}
if("pass".equals(fieldName)) {
pass=fileItem.getString("utf-8");
}
}else { //如果是文件
fileName=fileItem.getName(); //获取文件名
System.out.println("获取到的文件名是:"+fileName);
String newName=getNewName(fileName); //生成新文件名
File file=new File(uploadPath,newName);
//文件写入
fileItem.write(file);
}
}
System.out.println("解析出来的用户名是:"+name);
System.out.println("解析出来的密码是:"+pass);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//生成一个新的文件名
public String getNewName(String fileName) {
return System.currentTimeMillis()+fileName; //时间戳加上源文件名
}
}
二、文件下载
1. 下载页面 download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="downServlet?fileName=1562566700611dog.jpg">Java学习视频</a>
</body>
</html>
2. 下载 DownLoadServlet.java
- resp.addHeader(“Content-Disposition”, “inline;filename=”+fileName); 设置下载文件名
- resp.setContentType(“application/octet-stream”); 设置响应类型
package org.lanqiao.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
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 DownLoadServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收用户传入的文件名
String fileName=req.getParameter("fileName");
//设置消息头
resp.addHeader("Content-Disposition", "inline;filename="+fileName);
//设置响应的类型
resp.setContentType("application/octet-stream");
//获取文件的路径
String filePath=req.getSession().getServletContext().getRealPath("/upload");
//获取输入流
InputStream in=new FileInputStream(filePath+File.separator+fileName);
//声明输出流对象
OutputStream out=resp.getOutputStream();
byte[] buffer=new byte[1024];
int len=-1;
while((len=in.read(buffer))!=-1){
out.write(buffer,0,len);
}
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}