文件上传
为了实现文件上传,我们先下载jar包。从网上下载commons-fileupload包,但这个包对另一个jar包有依赖,所以同时还得下载commons-io包。这里,推荐采用maven下载。
下载完,导包,写代码。
jsp 部分
enctype属性设置为multipart/form-data可使表单同时上传文件和普通字段
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<form action="/UploadServlet" method="post" enctype="multipart/form-data">
学号:<input name="sno" /><br/>
姓名:<input name="sname" /><br/>
上传照片<input name="pictures" /><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
Servlet 部分
这里只写servlet中doGet部分代码
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 isMultipart = ServletFileUpload.isMultipartContent(request); //判断是否是multipart上传格式
if(isMultipart){
FileItemFactory factory = new DiskItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try{
List<FileItem> items = upload.parseRequest(request); // 解析请求
List<FileItem> iter = items.iterator(); // 生成迭代器
while(iter.hasNext()){
FileItem item = iter.next();
String itemName = item.getFileName(); // 普通字段采用getFieldName获取字段名
int sno = -1; // 学号
String sname = null; // 姓名
if(item.isFormField()){ // 判断前台字段是普通form字段还是文件字段
if(itemName.equals("sno")){ // 是学号
sno = Integer.parseInt(item.getString("UTF-8"));
}else if(itemName.equals("sname")){
sname = item.getString("UTF-8");
}
}else{
String path = request.getSession().getServletContext().getRealPath("upload"); // 获取文件夹路径
File file = new File(path, fileName); // 创建文件对象
item.write(file); // 文件写入
System.out.println(fileName + "上传成功!");
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
文件下载
jsp 部分
通过
<a>
标签带参数filename
将要下载的文件名传送至servlet
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<a href="DownloadServlet?filename=picture.png">下载</a>
</body>
</html>
Servlet 部分
这里只写servlet中doGet部分代码
protected void doGet(HttpRequestServlet request, HttpResponseServlet response) throws ServletException, IOException {
String fileName = request.getParameter("filename");
// 下载文件:需要设置消息头
response.addHeader("content-Type", "application/octet-stream"); // 二进制响应头
// 防止不同浏览器文件名称乱码
String agent = request.getHeader("User-Agent");
if(agent.toLowerCase().indexOf("firefox")!=-1){
/*
firefox需要加前缀=?UTF-8?
Base64.encode
String构造方法
后缀?
**/
response.addHeader("content-Disposition", "attatchment;filename==?UTF-8?B?" + new String(Base64.encodeBase64(fileName.getBytes("UTF-8")) + "?"));
}else{
response.addHeader("content-Disposition", "attachment:file"+URLEncoder.encode(fileName, "UTF-8")); // edge浏览器
}
// servlet通过文件的地址,将文件转为输入流读到servlet上下文中
InputStream in = getServletContext().getResourceAsStream("/picture.png");
// 通过输出流将刚才已经转为输入流的文件输出给用户
ServletOutputStream out = response.getOutputStream();
byte[] bs = new byte[10]; // 每次读10个字节
int len = -1;
while((len=in.read(bs))!=-1){
out.write(bs, 0, len);
}
out.close();
in.close();
System.out.println("下载完成!");
}
至此,上传与下载就实现了。