一、上传文件
依赖的jar包:
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
前端页面代码:
<form action="UpFileController" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="name"><br>
学号:<input type="text" name="studyid"><br>
上传文件:<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
Servlet代码:
public class UpFileController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("utf-8");
String name = null;
int studyid = 0;
boolean isHavemultipart = ServletFileUpload.isMultipartContent(request);// 用来获取前端是否设置enctype="multipart/form-data"属性
if (isHavemultipart) {
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(factory);
/*****限制上传文件大小的一种方法,如果文件大小超过限制的20480B,则抛出异常****/
//设置上传文件时的临时缓冲文件大小10KB
factory.setSizeThreshold(10240);
//设置临时缓冲文件所在目录
factory.setRepository(new File("uploadtemp"));
//对上传的文件的大小做限制 20KB
sfu.setSizeMax(20480);//单位:字节B
/**********************************************************************/
List<FileItem> items = sfu.parseRequest(request);// 解析form中的所有请求字段,并保存到item集合中(也就是前台传的name,studyid,和file)
Iterator<FileItem> iter = items.iterator();// 通过迭代器遍历items中的数据(也可以通过foreach遍历)
while (iter.hasNext()) {
FileItem item = iter.next();
// 判断是普通form字段,还是文件字段
if (item.isFormField()) {
// 如果是普通字段通过如下方式获取
String itemName = item.getFieldName();// 获取普通字段的名字
if (itemName.equals("name")) {
name = item.getString();
} else if (itemName.equals("studyid")) {
studyid = Integer.parseInt(item.getString());
}
} else {
try {
// 如果是文件字段则通过如下方式获取文件名
String fileName = item.getName();// 获取文件字段的名字(也就是文件名)
/******限制上传文件大小的另一种方法,如果文件大小超过限制的20480B,则抛出异常*********/
//获取文件大小,单位B
//Long fileSize = item.getSize();
//if(fileSize > 20480) {
// System.out.println("上传的文件超过规定的大小!");
// return;
//}
/**********************************************************************/
// 对上传文件的类型做限制
String ext = fileName.substring(fileName.indexOf(".") + 1);// 获取文件扩展名
if (!(ext.equals("png") || ext.equals("txt"))) {
System.out.println("上传文件类型有误!");
return;// 直接终止方法,保证文件不会被上传
}
// 定义文件上传位置,一般为服务器路径
// String filePath = "C:\\Program Files\\Apache Software Foundation\\Tomcat
// 7.0\\wtpwebapps\\useJDBCToLogin\\upload";
String filePath = request.getSession().getServletContext().getRealPath("upload");
File file = new File(filePath, fileName);
item.write(file);// 获取文件内容并上传
System.out.println(fileName + "上传成功!");
} catch(FileUploadException e){
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch(FileUploadBase.SizeLimitExceededException e){
//文件超过限制大小异常
System.out.println("上传的文件超过规定的大小!");
//e.printStackTrace();
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("name:" + name +",studyid:" + studyid);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
二、下载文件
不需要依赖任何jar包。
前端页面代码:(选择中文文件是为了解决中文乱码问题)
<a href="DownFileController?filename=派森.txt">派森</a>
Servlet部分:
public class DownFileController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//1、获取客户请求的文件名
String filename = request.getParameter("filename");
//顺道说一下get请求的编码方式为"ISO-8859-1",所以如果get请求中有中文字符就需要转为utf-8编码,才能正确显示出中文;
//同理从servlet向前端发送url时,如果其中有中文参数,也要将其由UTF-8转码为"ISO-8859-1",这里的编码问题亲自检测过谷歌、IE、火狐浏览器均正常
//前面说的是get请求,而当post请求时,只要设置request.setCharacterEncoding("utf-8")即可
filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");//解析请求中的中文参数
String file = URLEncoder.encode(filename,"utf-8");
//2、下载文件需要设置消息头
response.addHeader("content-Type", "application/octet-stream");//设置响应的文件类型为二进制文件
//response.addHeader("content-Disposition", "attachment;filename=" + URLEncoder.encode(file,"utf-8"));
response.addHeader("content-Disposition", "attachment;filename=" + new String(file.getBytes("utf-8"),"ISO-8859-1"));
//3、输入流:Servlet通过文件的地址,将文件转为输入流读如Servlet中
InputStream in = getServletContext().getResourceAsStream("/DownResc/" + filename);
//4、输出流:通过输出流将刚才已经转为输入流的文件输出给用户
ServletOutputStream out = response.getOutputStream();
//5、开始读文件
byte[] bs = new byte[1024];
int len = -1;
while ((len=in.read(bs)) != -1) {
out.write(bs, 0, len);
}
//6、关闭输入、输出流
out.close();
in.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}