上传文件直接上代码:
首先是index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<form action="/UpLoadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="upload" value="上传">
</form>
</body>
</html>
然后是Servlet
package com.yf.Servlet.Demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/UpLoadServlet")
//说明该Servlet是用来处理multipart/form-data类型的请求
@MultipartConfig
public class UpLoadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter printWriter = response.getWriter();
//Servelt3.0中引入新方法,处理multipart/form-data类型编码的表单
Part part = request.getPart("file");
//获得HTTP头信息
String headerInfo = part.getHeader("content-disposition");
//System.out.println(headerInfo);//form-data; name="file"; filename="百度云盘.txt"
//获取文件名
String fileName = headerInfo.substring(headerInfo.lastIndexOf("=")+2,headerInfo.length()-1);
//System.out.println(fileName);
//获取存储上传文件的文件夹路径
String fileSavingFolder = this.getServletContext().getRealPath("/UpLoad");
//获得存储上传文件的完整路径(文件夹路径+文件名)
String fileSavingPath = fileSavingFolder+ File.separator+fileName;//File.separator就是斜线
//如果存储上传文件的文件夹不存在,则创建文件夹
File file = new File(fileSavingFolder+File.separator);
if(!file.exists()){
file.mkdirs();
}
part.write(fileSavingPath);//将上传文件内容写入服务器文件中
printWriter.println("文件上传成功!");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
步骤很简单,就是Part part = request.getPart(“file”);
part.write(“filename”);就是获得文件,然后把文件写入服务器。这里面有个小小的问题,我发现在不同的服务器中,String headerInfo = part.getHeader(“content-disposition”);得到的路径不一样,在谷歌浏览器是直接得到文件名,而IE得到的是文件的绝对路径,不过这个对我们没有影响。
下载文件:
package com.yf.Servlet.Demo;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
@WebServlet("/DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter printWriter = response.getWriter();
//文件的相对路径
String filepath = "/WEB-INF/web.xml";
//文件的绝对路径//D:\Servlet\target\Servlet\WEB-INF\text.txt
String fullFilepath = request.getServletContext().getRealPath(filepath);
//System.out.println(fullFilepath);
//打开文件,创建File类型的文件对象
File file = new File(fullFilepath);
if(file.exists()){
//获得文件名,并以UTF-8编码方式进行编码,以解决乱码
String filename = URLEncoder.encode(file.getName(),"utf-8");
//重置response
response.reset();//清除首部空白行,清除缓存
//设置文件的类型
response.setContentType("text/xml");
//设置HTTP头的内容
response.addHeader("Content-Disposition","attachment:filename=\""+filename+"\"");
//设置文件长度
int fileLength = (int)file.length();
response.setContentLength(fileLength);
//如果文件长度大于0
if(fileLength != 0){
//创建输入流(read)将数据读入到程序
FileInputStream fileInputStream = new FileInputStream(file);
//设置缓存区
byte[] buff = new byte[4096];
//创建输出流(write)将数据输出程序
ServletOutputStream servletOutputStream = response.getOutputStream();
int readLength;
//fileInputStream.read(buff))的作用是将buff.lenght个字节的数据读入buff数组中
while((readLength=fileInputStream.read(buff))!=-1){
//servletOutputStream.write(buff,0,readLength);的作用就是把buff中的数据输出到response
servletOutputStream.write(buff,0,readLength);
}
fileInputStream.close();
servletOutputStream.flush();
servletOutputStream.close();
}
}else{
printWriter.println("文件不存在,请检查文件路径");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}