文章目录
- 1 文件上传
- 1.0 首页准备
- 1.1 创建文件上传对象
- 1.2 初始化文件上传对象
- 1.3 设置编码
- 1.4 文件上传
- 1.5 获取文件信息和表单上的其他信息
- 1.6 设置文件保存路径
- 1.7 将上传的文件保存到服务器
- 1.7.1 解释
- 1.8 跳转页面
- 1.9 完整代码
- 2 下载文件
1 文件上传
使用SmartUpload类进行操作。分为以下几个步骤
1.0 首页准备
- 首页需要有一个表单。表单必须设置:
enctype="multipart/form-data"
,以及提交方式:method="post"
- 文件输入框必须设置name属性,否则会报错
Files' name is invalid or does not exist (1205)
1.1 创建文件上传对象
SmartUpload smartUpload = new SmartUpload();
1.2 初始化文件上传对象
需要通过pageContext对象进行初始化。如果请求提交到了jsp页面,则直接可以通过jsp内置的pageContext对象进行操作。如果请求提交到了servlet,则需要通过如下的方法得到pageContext:
PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(this. req, resp, null, false, 8192, true);
解释:
参数 | 含义 |
servlet | 请求的servlet,在servlet中传this即可 |
request | servlet上挂起的当前请求 |
response | servlet上挂起的当前响应 |
errorPageURL | 请求JSP的错误页面的URL,或null |
needsSession | 是否需要session |
buffer | 以字节为单位的缓冲区大小 |
autoflush | 缓冲区应该在缓冲区溢出时自动刷新到输出流,还是抛出IOException |
然后就可以进行初始化了:
smartUpload.initialize(pageContext);
1.3 设置编码
smartUpload.setCharSet("utf-8");
1.4 文件上传
这里相当于是把文件上传到了smartUpload这个对象里。
smartUpload.upload();
1.5 获取文件信息和表单上的其他信息
- 要取得文件信息,通过
File file = smartUpload.getFiles().getFile(0);
文件对象获得。 - 要取得表单上的其他文字信息,需要通过
Request request = smartUpload.getRequest();
得到的request获取(servlet的req参数无法得到)。
String userName = request.getParameter("username");
String userPass = request.getParameter("userpass");
System.out.println(userName + ", " + userPass);
File file = smartUpload.getFiles().getFile(0); //得到文件对象
String fileName = file.getFileName(); //得到文件名(有后缀,例如:myPic.gif)
String contentType = file.getContentType(); //得到文件类型,例如:image/gif
注意:上面的getFiles()得到的是一个 com.jspsmart.upload.Files 对象。它的getFile设置参数是下标。File对象不是java.io的File类,而是com.jspsmart.upload.File 类。
1.6 设置文件保存路径
String path = "/uploadfile/" + fileName;
注意:先在web根目录下创建uploadfile文件夹,并且在里面随意新建一个文件,否则该文件夹不会部署到项目。
1.7 将上传的文件保存到服务器
file.saveAs(filename, File.SAVEAS_VIRTUAL);
1.7.1 解释
Files类中的saveAs()方法用于保存文件,在File类中提供了两种形式的saveAs()方法:
- saveAs(String destFilePathName)方法。
- saveAs(String destFilePathName, int optionSaveAs)方法。
这两个方法没有返回值,第一种形式与saveAs(destFilePathName, 0)执行效果相同。
参数说明 :
-
destFilePathName
:指定文件保存的路径,包括文件名。其值应以“/”开头。 optionSaveAs
:保存目标选项。该选项有3个值,分别是SAVEAS_AUTO、SAVEAS_VIRTUAL和SAVEAS_PHYSICAL。
- SAVEAS_VIRTUAL:以Web应用的根目录为文件根目录,然后加上destFilePathName参数指定的路径来保存文件;如果Web根目录下不存在destFilePathName,则直接报500错误。
- SAVEAS_PHYSICAL,一种情况是将以Web服务器的安装路径中的磁盘根目录为文件根目录,然后加上destFilePathName参数指定的路径来保存文件;另一种情况则以destFilePathName参数指定的目录为最终目录来保存文件;
- 设为SAVEAS_AUTO,则首先以SAVEAS_VIRTUAL方式来保存文件,若Web应用下destFilePathName参数指定的路径不存在,则以SAVEAS_PHYSICAL方式保存文件。
参考:https://programtip.com/zh/art-90386
1.8 跳转页面
跳转之前可以先设置一些参数。
req.setAttribute("username",userName);
req.setAttribute("userpass",userPass);
req.setAttribute("filename", fileName);
req.getRequestDispatcher("show.jsp").forward(req, resp);
1.9 完整代码
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
// 1. 创建文件上传对象
SmartUpload smartUpload = new SmartUpload();
// 2.初始化文件上传对象
PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(this, req, resp, null, false, 8192, true);
smartUpload.initialize(pageContext);
// 2.1 设置字符集
smartUpload.setCharset("utf-8");
// 3. 上传文件
smartUpload.upload();
// 4. 获得文件信息
File file = smartUpload.getFiles().getFile(0);
String fileName = file.getFileName();
String contentType = file.getContentType();
System.out.println("fileName:" + fileName + ", contentType:" + contentType);
// 5. 指定上传路径
String path = "/uploadfile/"+fileName;
// 6. 保存上传的文件
file.saveAs(path, File.SAVEAS_VIRTUAL);
// 7.跳转到成功页面
Request request = smartUpload.getRequest();
String userName = request.getParameter("username");
String userPass = request.getParameter("userpass");
req.setAttribute("username",userName);
req.setAttribute("userpass",userPass);
req.setAttribute("filename", fileName);
req.getRequestDispatcher("show.jsp").forward(req, resp);
} catch (SmartUploadException e) {
e.printStackTrace();
}
}
注意:不要把请求的url和文件保存路径设置重名了,这样会报错。
2 下载文件
String name=request.getParameter("filename");
String url="uploadfile/"+name;
//将响应的内容设置为通用的二进制流
response.setContentType("application/octet-stream");
//attachment 告诉浏览器以附件的方式下载文件(弹出下载框)
name=URLEncoder.encode(name,"utf-8");
response.addHeader("Content-Disposition","attachment;filename="+name);
request.getRequestDispatcher(url).forward(request, response);
//清空缓冲区:将服务端缓冲区的文件内容,立即权并不传送给客户端
response.flushBuffer();