文件上传
上传文件需要用到两个jar包
commons-fileupload.jar
commons-io.jar
现将两个包导入项目的lib目录下:
前台jsp代码
要想上传文件,form表单中就要添加encType属性,属性值为multipart/form-data
注:提交方式必须为post,get方式受地址栏长度影响不能传输太大的文件。
<form action="UploadServlet" method="post" enctype="multipart/form-data">
学号:<input type="text" name="sno"><br>
姓名:<input type="text" name="sname"><br>
上传照片:<input type="file" name="cpicture"><br>
<input type="submit" value="注册">
</form>
Servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");
//上传
boolean isMuitipart = ServletFileUpload.isMultipartContent(request);
if(isMuitipart) { //判断前台form表单是否有multipart属性
FileItemFactory factory = new DiskFileItemFactory() ;
ServletFileUpload upload = new ServletFileUpload(factory);
//通过parseRequest方法解析form表单中的所有请求字段保存在items集合中
List<FileItem> parseRequest=null;
try {
parseRequest = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
Iterator<FileItem> iter = parseRequest.iterator();
while(iter.hasNext()) {
FileItem item = iter.next();
String name = item.getFieldName();
//判断item中字段是普通form字段(sno,sname)还是文件字段(spicture)
if(item.isFormField()) {
if(name.equals("sno")) {
String sno = item.getString("utf-8"); //参数为编码方式
//······
}else if(name.equals("sname")) {
String sname = item.getString("utf-8");
//·········
}else {
System.out.println("```");
}
}else { //文件字段
//getFildName()是获取form字段名,
//getName()获取文件名
String fileName = item.getName();
//开始上传
String path = "D:\\英雄时刻";
File file = new File(path,fileName);
try {
item.write(file);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
文件下载
文件下载,只需在表示层前台代码传文件名给Servlet,Servlet读取文件在传给客户即可。
前台代码请求Servlet:
<a href="DownloadServlet?filename=取消的网课.txt">下载照片</a>
Servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//获取文件名,转为ISO-8859-1是为了能够显示中文文件名称
String filename = new String(request.getParameter("filename").getBytes(),"ISO-8859-1");
//设置两个消息头
response.addHeader("content-Type", "application/octet-stream");//第二个参数为MIME类型
response.addHeader("content-Disposition", "attachement;filename="+filename);
//Servlet通过文件地址将该文件转为输入流 读到servlet中
InputStream in = getServletContext().getResourceAsStream("/res/取消的网课.txt");
//通过输出流将文件 输出给用户
ServletOutputStream out = response.getOutputStream();
byte[] bytes = new byte[10];
int len = -1;
while( (len=in.read(bytes)) != -1 ) {
out.write(bytes, 0, len);
}
out.close();
in.close();
}
注:文件拓展名与Content-Type对应表:http://www.fairysoftware.com/content_type.html
常见类型:
文件类型 | Content-Type |
---|---|
二进制文件 | application/octet-stream |
Word | application/msword |
Excel | application/vnd.ms-excel |
PPT | application/x-ppt |
application/pdf | |
图片 | image/gif 、image/bmp 、image/jpeg |
文本文件 | text/plain |