文件上传与下载
1 上传流程
采用 smartupload.jar 实现文件上传
-
将jar包添加至项目lib下/或者添加依赖
-
上传的页面
<form action="toUpload" method="post" enctype="multipart/form-data" >
书名:<input type="text" name="bookName"/><br>
图片:<input type="file" name="自定义名称"/><br>
<input type="submit" value="提交"/>
</form>
注:
- form 表单必须使用post提交方式,因为get方式有大小限制
- form表单必须添加属性:enctype=“multipart/form-data”,此属性设定表单编码类型
enctype 值 | 描述 |
---|---|
application/x-www-form-urlencoded | 在发送前编码所有字符(默认) |
multipart/form-data | 不对字符编码。在使用包含文件上传控件的表单时必须使用该值。 |
text/plain | 空格转换为 “+” 加号,但不对特殊字符编码。 |
- 获取文件
- 获取上传文件对象
- 获取pageContext对象
- 上传文件
- 得到文件的基本信息
- 将文件保存至指定的目录
// 获取上传文件对象 smartupload将请求封装了起来
SmartUpload sud = new SmartUpload();
// 获取pageContext对象
PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(this, request, response, null, false, 1024, true);
// 初始化sud
sud.initialize(pageContext);
sud.setCharset("utf-8");
// 上传文件
try {
sud.upload();
// 获取上传文件的信息
Files files = sud.getFiles();
// 遍历文件得到每个文件的信息
File file = files.getFile(0);
String fileName = file.getFileName();
String contentType = file.getContentType();
System.out.println(request.getContextPath());
String url = "upload/"+fileName;
// 上传至指定的目录
System.out.println(url); //upload/文件名
file.saveAs(url,SmartUpload.SAVE_VIRTUAL);// 虚拟路径
String username = sud.getRequest().getParameter("username");
System.out.println(username);
} catch (SmartUploadException e) {
e.printStackTrace();
}
注:
- 表单中若有其他数据,不能直接通过request来获取,需要通过SmartUpload对象获取
- 关于抽象方法:JspFactory.getDefaultFactory().getPageContext(this, request, response, null, false, 1024, true);
public abstract PageContext getPageContext(Servlet var1, ServletRequest
var2, ServletResponse var3, String var4, boolean var5, int var6, boolean var7)
参数 | 含义 |
---|---|
servlet | 请求的servlet,在servlet中传this即可 |
request | servlet上挂起的当前请求 |
response | servlet上挂起的当前响应 |
errorPageURL | 请求JSP的错误页面的URL,或null |
needsSSession | 是否需要session |
buffer | 以字节为单位的缓冲区大小 |
autoflush | 缓冲区应该在缓冲区溢出时自动刷新到输出流,还是抛出IOException |
- 常用方法
属性名称 | 说明 |
---|---|
public final void initialize(PageContext page) | 执行上传和下载的初始化操作,必须实现 |
public void upload() | 实现文件数据的上传,在初始化后执行 |
public int save(String pathName) | 将全部上传文件保存到指定目录下,并返回保存文件的个数 |
public void setAllowFilesList(String ExtList) | 指定允许上传的文件扩展名,接收一个扩展名列表 |
public void setDeniedFilesList(String list) | 指定禁止上传的文件名列表,扩展以逗号隔开 |
public void setMaxFileSize(long filesize) | 设定每个文件允许上传的最大长度 |
public void setTotalMaxFileSize(long total) | 设定允许上传文件的总长度 |
2 文件的下载
- 获取下载文件的名称
- 通古getRealPath获取所下载文件在服务器的真实路径
- 设置响应头信息
- content-type:mimer(通过ServletContext获取)
- content-disposition:attachment;filename=filename(默认是内联形式)
- 通过本地字节流将文件加载到内存,然后通过字节输出流输出到客户端
// 先获取下载文件名
String filename = request.getParameter("filename");
// 找到 文件的服务器路径
String realPath = request.getRealPath("upload/"+filename);
System.out.println(realPath);
//D:\JavaTest\out\artifacts\XZK_Demo1_war_exploded\upload\xzk.pdf
// 获取所下载文件的类型
String mimeType = request.getServletContext().getMimeType(filename);
// 设置响应头
response.setHeader("content-type",mimeType);
response.setHeader("content-disposition","attachment;filename="+filename);
// 通过字节输入流将本地文件加载到内存
InputStream is = new FileInputStream(realPath);
ServletOutputStream os = response.getOutputStream();
byte[] b = new byte[1024];
int len = 0;
while ((len = is.read(b)) != -1) {
os.write(b,0,len);
}
is.close();
os.close();