文件上传与下载权限的控制

来源:互联网 发布:ubuntu怎么上传lrzsz包 编辑:程序博客网 时间:2024/04/30 23:00

本文区分于《【Jsp】把Java写到Respond输出流里面供用户下载》(点击打开链接)把原本该打印到控制台的内容,直接打印到一个文本文件txt中给用户下载。

实际上是《【Struts2】中文文件的下载与下载权限的控制》(点击打开链接)不使用三大框架,纯属使用Servlet去实现,如何把在Tomcat服务端上的文件资源,给用户下载。

如下图的JavaEE目录结构,在Tomcat上ServletDownloadTest工程的根目录有张Chrysanthemum.jpg的图片


但是,用户输入http://localhost:8080/ServletDownloadTest/download.java访问名为download这个Servlet会出现一个下载图片的下载提示框,如下图:


下载之后可以打开,而不是像img标签那样,直接把图片标签显示在网页。

这里是显示很简单,首先由于使用了Servlet3.0的注释方式,web.xml里面什么都没有,

[html] view plain copy
print?
  1. <?xml version=“1.0” encoding=“UTF-8”?>  
  2. <web-app xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”  
  3.     xmlns=“http://java.sun.com/xml/ns/javaee”  
  4.     xsi:schemaLocation=“http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd”  
  5.     version=“3.0”>  
  6.   
  7. </web-app>  
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://java.sun.com/xml/ns/javaee"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"    version="3.0"></web-app>
关键是download.java里面的代码,获取服务端存放文件的真实路径之后,把这个文件先写到缓冲区,再把缓冲区的东西写到respond输出流供用户下载。

[java] view plain copy
print?
  1. import java.io.*;  
  2. import java.net.*;  
  3. import javax.servlet.*;  
  4. import javax.servlet.http.*;  
  5. import javax.servlet.annotation.*;  
  6.   
  7. @WebServlet(name = “download”, urlPatterns = { “/download” })  
  8. public class download extends HttpServlet {  
  9.     private static final long serialVersionUID = 1L;  
  10.   
  11.     protected void service(HttpServletRequest request,  
  12.             HttpServletResponse response) throws ServletException, IOException {  
  13.         String filePath = this.getServletContext().getRealPath(“/”);// 获取真实路径  
  14.         String downloadFilename = ”中文是没有问题的.jpg”;// 在下载框默认显示的文件名  
  15.         downloadFilename = URLEncoder.encode(downloadFilename, ”UTF-8”);  
  16.         // 对默认下载的文件名编码。不编码的结果就是,在客户端下载时文件名乱码  
  17.         File file = new File(filePath + File.separator + “Chrysanthemum.jpg”);  
  18.         if (file.exists()) {  
  19.             // 写明要下载的文件的大小  
  20.             response.setContentLength((int) file.length());  
  21.             response.setHeader(”Content-Disposition”“attachment;filename=”  
  22.                     + downloadFilename);// 设置在下载框默认显示的文件名  
  23.             response.setContentType(”application/octet-stream”);// 指明response的返回对象是文件流  
  24.             // 读出文件到response  
  25.             // 这里是先需要把要把文件内容先读到缓冲区  
  26.             // 再把缓冲区的内容写到response的输出流供用户下载  
  27.             FileInputStream fileInputStream = new FileInputStream(file);  
  28.             BufferedInputStream bufferedInputStream = new BufferedInputStream(  
  29.                     fileInputStream);  
  30.             byte[] b = new byte[bufferedInputStream.available()];  
  31.             bufferedInputStream.read(b);  
  32.             OutputStream outputStream = response.getOutputStream();  
  33.             outputStream.write(b);  
  34.             // 人走带门  
  35.             bufferedInputStream.close();  
  36.             outputStream.flush();  
  37.             outputStream.close();  
  38.         }  
  39.     }  
  40. }  
import java.io.*;import java.net.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;@WebServlet(name = "download", urlPatterns = { "/download" })public class download extends HttpServlet {    private static final long serialVersionUID = 1L;    protected void service(HttpServletRequest request,            HttpServletResponse response) throws ServletException, IOException {        String filePath = this.getServletContext().getRealPath("/");// 获取真实路径        String downloadFilename = "中文是没有问题的.jpg";// 在下载框默认显示的文件名        downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");        // 对默认下载的文件名编码。不编码的结果就是,在客户端下载时文件名乱码        File file = new File(filePath + File.separator + "Chrysanthemum.jpg");        if (file.exists()) {            // 写明要下载的文件的大小            response.setContentLength((int) file.length());            response.setHeader("Content-Disposition", "attachment;filename="                    + downloadFilename);// 设置在下载框默认显示的文件名            response.setContentType("application/octet-stream");// 指明response的返回对象是文件流            // 读出文件到response            // 这里是先需要把要把文件内容先读到缓冲区            // 再把缓冲区的内容写到response的输出流供用户下载            FileInputStream fileInputStream = new FileInputStream(file);            BufferedInputStream bufferedInputStream = new BufferedInputStream(                    fileInputStream);            byte[] b = new byte[bufferedInputStream.available()];            bufferedInputStream.read(b);            OutputStream outputStream = response.getOutputStream();            outputStream.write(b);            // 人走带门            bufferedInputStream.close();            outputStream.flush();            outputStream.close();        }    }}


原创粉丝点击