文章目录

  • 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);

解释:

JAVA 下载文件 返回纯文本的文件 java下载文件弹出保存路径_java

参数

含义

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();