Java Web之下载文件

  下载的文件,不能随便的被访问,放在外面的文件夹肯定不行,url一敲就能访问了,所以我们要放在WEB-INF文件夹里面,WEB-INF文件夹只有Servlet才能访问,我们新建一个文件夹,叫download里面我放了三个文件,一个zip,一个exe,一个png,如图:

  我新建了一个JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>下载文件</title>
</head>
<body>
<h3>下载文件</h3>
<a href="/download?filename=ColorPix_CHS.zip">ColorPix_CHS.zip</a><br>
<a href="/download?filename=QQ9.0.4.exe">QQ9.0.4.exe</a><br>
<a href="/download?filename=小女孩.png">小女孩.png</a><br>

</body>
</html>

  一个Servlet

package com.vae.download;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1.检查权限,检查积分或者什么什么币,这个不讲

        //2.获取下载的资源文件的名称,并且进行转码,转码是为了让你的中文文件显示的时候不乱码,但是我不转码也没乱码
        String filename = req.getParameter("filename");
        filename=new String(filename.getBytes("ISO-8859-1"),"UTF-8");
        //3.从服务器中获取想下载的文件的绝对路径
        String realPath=super.getServletContext().getRealPath("/WEB-INF/download/"+filename);
        //4.告诉浏览器不要打开文件,直接下载,原因是IE6会直接打开文件,所以这个算是特意为IE6设置的
        resp.setContentType("application/x-msdownload");
        //5.设置下载文件的时候,文件名称应该是文件自己本身的名称,因为默认的下载名称的down
        String userAgent=req.getHeader("User-Agent");
        if (userAgent.contains("MSIE")) {
            //如果是IE浏览器,是这种编码格式
            filename=URLEncoder.encode(filename,"UTF-8");
        }else {
            //非IE浏览器,是这种编码格式
            filename=new String(filename.getBytes("UTF-8"),"ISO-8859-1");
        }
        resp.setHeader("Content-Disposition","attachment;filename="+filename);
        //6.下载文件
        Files.copy(Paths.get(realPath),resp.getOutputStream());

    }
}

  需要讲解的都在注释里面了

  

原文地址:https://www.cnblogs.com/yunquan/p/10300774.html

时间: 2024-07-31 22:36:24

Java Web之下载文件的相关文章

Java 通过 HTTP 下载文件

1. [代码]Download.java   package core.spider; import java.io.*;import java.net.*;import java.util.*; // This class downloads a file from a URL.class Download extends Observable implements Runnable {         // Max size of download buffer.    private st

java 的在线下载文件 .pdf

java  的在线下载文件  .pdf 1.下载资源的本地位置 2.设置响应头 3.下载代码 1 PeriodicalResource periodicalResource = periodicalResourceService.get(id); 2 String filePath = periodicalResource.getAttachment();//获取资源位置 3 File file = new File(periodicalBaseDir + filePath);//本地资源位置

java 从网上下载文件的几种方式 (转)

package com.github.pandafang.tool; import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.nio.channels.Channels;import java.nio.cha

多线程爬虫Java调用wget下载文件,独立线程读取输出缓冲区

写了个抓取appstore的,要抓取大量的app,本来是用httpclient,但是效果不理想,于是直接调用wget下载,但是由于标准输出.错误输出的原因会导致卡住,另外wget也会莫名的卡住. 所以我采用: 一.独立线程读取输出信息: 二.自己实现doWaitFor方法来代替api提供的waitFor()方法,避免子进程卡死. 三.设置超时,杀死wget子进程,没有正确返回的话,重试一次,并把超时时间加倍: 有了以上操作,wget不会卡死,就算卡住了也会因为超时被干掉再重试一次,所以绝大部分的

java实现FTP下载文件

ftp上传下载文件,是遵照ftp协议上传下载文件的,本例仅以下载文件为例. 重要的方法解释: 1.FTP功能相关依赖路径:org.apache.commons.net.ftp.*: 2.ftp默认端口是21,如果非默认端口连接,需指定:ftp.connect(ftphostaddr, 22);//22为端口号 3.ftp.changeWorkingDirectory(ftppath) //实现切换目录 4.FTPFile[] fs = ftp.listFiles(); 获取指定目录下的文件列表

java 使用流下载文件

public HttpServletResponse download(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径. File file = new File(path); // 取得文件名. String filename = file.getName(); // 取得文件的后缀名. String ext = filename.substring(filename.lastIndexOf(".&qu

Java Web开发之文件上传

文件上传有SmartUpload.Apache的Commons fileupload.我们今天介绍Commons fileupload的用法. 1.commons-io.jar 和commons-fileupload-1.3.1.jar 下载地址:http://pan.baidu.com/s/1kVtYMzH 2.web.xml 1 <!-- 上传文件 服务器端 --> 2 <servlet> 3 <servlet-name>UploadServlet</serv

彻底解决java WEB项目的文件路径问题(war包)

在j2EE项目中,我们通常会把项目打包公布,通常是war包,作为独立单元,能够远程上传,载入,公布,还能够实现版本号控制,但这与我们开发过程中使用MyEclipse自己主动部署有所不同,下面做具体说明. 使用war包部署,在tomcat和WebLogic下部署有非常大的差别,tomcat会把war自己主动加压到当前文件夹下,然后再用解压的文件夹来公布,这与一般不会出现太大的意外,但假设是用WebLogic公布,就不会被解压,假设开发过程中不注意,war包公布后就有可能出现找不到文件的现象.比如:

JAVA WEB 获取properties文件,存放路径 及 获取路径

首先明白,ClassPath : 指的是:WEB-INF\classes这个目录下,通常把文件放在src文件夹下,或者新建文件并且添加到build path即可.IDE在同步文件到tomcat时会自动将文件放在classes下. 获取properties的代码: public Properties loadProperties() { Properties properties = new Properties(); InputStream stream = this.getClass().ge