文件的下载

Posted 名字真的很急用

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件的下载相关的知识,希望对你有一定的参考价值。

  • 超链接的文件下载:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图片的下载</title>
</head>
<body>
<h1>超链接的文件下载</h1>

<a href="imags/01.jpg">下载文件01</a>
<br>
<a href="imags/02.jpg">下载文件02</a>
</body>
</html>

超链接文件下载,下载的图片默认是在浏览器显示。

http://localhost:8080/imags/01.jpg

该请求地址是一个资源,是无法处理请求的,为什么下载的图片会在浏览器显示呢?
在Tomcat的conf目录下的web.xml文件中配置了DefaultServlet会在服务器启动的时候自动创建。如果请求资源没有对应的servlet,服务器就会根据默认的DefaultServlet来进行处理。

 <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- The mappings for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

DefaultServlet会使用字节输入流读取文件(image/…)生成对应的输入流对象,然后使用字节输出流将输入流的字节流数据写到浏览器。

  • 自定义servlet实现文件的下载
<h1>自定义servlet文件下载</h1>

<a href="download?filename=01.jpg">下载文件01</a>
<br>
<a href="download?filename=02.jpg">下载文件02</a>
</body>
</html>
@WebServlet("/download")
public class downServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String filename = req.getParameter("filename");
        String mimeType = getServletContext().getMimeType(filename);
        System.out.println("文件下载的类型"+mimeType);
        resp.setHeader("Content-Type",mimeType);

        //解决中文乱码
        String encode = URLEncoder.encode(filename, "UTF-8");
        //设置响应头告诉浏览器下载文件而不是显示文件
        resp.setHeader("Content-Disposition","attachment;filename="+encode);


        String file ="imags/"+filename;
        InputStream resourceAsStream = getServletContext().getResourceAsStream(file);
        ServletOutputStream outputStream = resp.getOutputStream();
        byte[] bytes = new byte[1024];
        int length=0;
        while((length=resourceAsStream.read(bytes))!=-1){
            outputStream.write(bytes,0,length);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  • 使用框架common-io的实现
    首先需要下载依赖。
<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.5</version>
</dependency>

在我们没有使用框架的时候:

 byte[] bytes = new byte[1024];
        int length=0;
        while((length=resourceAsStream.read(bytes))!=-1){
            outputStream.write(bytes,0,length);

在我们使用了框架后只需要写:

IOUtils(inputStream,outputStream);

大大简化了我们的代码。

在我们后续的学习阶段要转变思想:有现成的框架尽量使用现成的框架,现阶段不要重复发明轮子,而是熟练的掌握一些开源框架的使用。

以上是关于文件的下载的主要内容,如果未能解决你的问题,请参考以下文章

根据图片的url地址下载图片到本地保存代码片段

片段中的Firebase数据不是持久的,会重新下载

Xamarin Android 片段库

16个必备的JavaScript代码片段

我无法从 firebase 获取下载网址()。请任何人帮助这是我的代码和错误。 (我正在使用片段)[重复]

用于从 cloudkit 检索单列的代码模式/片段