文件下载_文件下载问题 - CSDN
精华内容
参与话题
  • 文件下载的三种方式

    千次阅读 2018-08-14 12:10:04
    1。 第一种方法是前后端的接口只给了一个API请求: 前端第一种实现方式: <a href="/downloadfilerouter" download>&...&

    1。 第一种方法是前后端的接口只给了一个API请求:

    前端第一种实现方式:

     <a href="/downloadfilerouter" download></a>
     *备注: download属性只支持firefox, chrome,不支持IE*

    前端第二个实现是使用一个div标签,使用click事件,创建一个a标签

    <div name="downloadfile"
    onclick="downloadFileFunction()">DownLoader</div>
    function downloadFileFunction() {
        let a = document.createElement('a');
        a.href = '/downloadfilerouter';
        a.click();
    }  

    后端使用nodejs,我在这里把下载的文件固定了,也可以自己传人一个变量进入,在这里需要导入两个模块

    var fs = require('fs');
    var path = require('path');
    router.get('/downloadfilerouter', function (req, res, next) {
        var filename = 'desktop.ini';
        var filepath = path.join(__dirname, '../uploader/' + filename);
        var stats = fs.statSync(filepath);
        if (stats.isFile()) {
            res.set({
                'Content-Type': 'application/octet-stream',
                'Content-Disposition': 'attachment; filename=' + filename,
                "Content-Length": stats.size
            });
            fs.createReadStream(filepath).pipe(res);
        } else {
            res.end(404);
        }
    });
    **在firefox中,
    'Content-Disposition': 'attachment; filename=' + filename,文件名不能正常显示
    修改为以下代码:
    "content-disposition", "attachment;filename*=UTF-8''"+ filename
    **

    2。第二种是定义的接口不是下载文件的路径,而是通过API可以获得文件的内容,由前端把内容写入到文件中,这种方法是通过获取文件信息,在网页上利用click事件,创建一个文件,然后将文件信息写入到文件中,然后保存。

    <a name="download" (click)="downloadfile()"></a> 
    downloadfile(){  
        this.filecontent = "this is my file content"; 
        this.url = "localhost:8000/home/home/file.txt";
        let a = document.createElement('a');
        a.href = "data:text/json;charset=utf-8,"+      
        this.filecontent;
        a.download = "myfilename";
        a.click();
    }

    3。 第三种方法和第一种类似,只是创建的是一个iframe。

    <a name="download" (click)="downloadfile()"></a>
    downloadfile(){
        this.url = "localhost:8000/home/home/file.txt";
        let elem = document.createElement('iframe');
        elem.src = url;
        elem.style.display = 'none';
        document.body.appendChild(elem);
    }

    前两种方法详见:https://github.com/webPageDev/Demo

    web端最简单的下载文件方式是采用html中a标签形式直接进行下载,只需要将文件的全路径赋值给href,同时给download属性赋予文件名即可。有些浏览器(IE8-11等)则在网页上直接打开,有时候还会是乱码。所以为了彻底解决这个,需要在服务器端想办法进行解决。
    在spring框架下,通过href链接下载时,设置Servlet拦截相应的url,然后进入后台进行相应的输入。 示例代码如下:

    public void fileOutputStream(HttpServletRequest req, HttpServletResponse resp) 
                    throws ServletException, IOException {
                String filepath = req.getRequestURI();
                int index = filepath.indexOf(Global.USERFILES_BASE_URL);
                if(index >= 0) {
                    filepath = filepath.substring(index + Global.USERFILES_BASE_URL.length());
                }
                try {
                    filepath = UriUtils.decode(filepath, "UTF-8");
                } catch (UnsupportedEncodingException e1) {
                    logger.error(String.format("解释文件路径失败,URL地址为%s", filepath), e1);
                }
                File file = new File(Global.getUserfilesBaseDir() + 
                            Global.USERFILES_BASE_URL + filepath);
                try {
                    resp.setContentType("application/x-msdownload; charset=utf-8");  
                    resp.setHeader("Content-Disposition", "attachment;");
                    FileCopyUtils.copy(new FileInputStream(file), resp.getOutputStream());
                    return;
                } catch (FileNotFoundException e) {
                    req.setAttribute("exception", new FileNotFoundException("请求的文件不存在"));
                    req.getRequestDispatcher("/WEB-INF/views/error/404.jsp").forward(req, resp);
                }
            }

    关键代码:resp.setHeader(“Content-Disposition”, “attachment;”);这里指定输出是附件。这样的话,就明确的告诉浏览器这是在下载附件,从而解决了不同浏览器可能会出现直接打开文件甚至乱码问题。
    对于tomcat而言,查看conf/web.xml,寻找所有的mime类型,如果存在你需要下载的文件的话,即不用进行修改,如果不存在的话,需要添加,然后重启服务器,给a标签赋值要下载文件的全路径即可(比如xls的文件就不用修改配置,而rar就需要配置,zip也不需要配置);注意,如果路径中包含中文的话,还需要稍微改动,否则可能会无法下载,需要在Server.xml文件中,在http端口设置处,需要加上编码,如下:

    注意URIEncoding赋值为UTF-8,。因为对于get方式请求过来的编码,若文件路径中存在中文,则可能出现乱码。对于post请求过来的编码,可以用传统的request.setContent**方式进行配置。

    展开全文
  • java实现文件下载

    万次阅读 2019-07-07 09:45:31
    原理是使用java.io中的File类打开要下载文件,用输入流将文件读入系统,再将response中的输出流连接到系统,通过输入流和输出流进行文件下载。 在response的响应头中设置下载文件的文件名 /** * 下载文件 * @...

    原理是使用java.io中的File类打开要下载的文件,用输入流将文件读入系统,再将response中的输出流连接到系统,通过输入流和输出流进行文件下载。

    在response的响应头中设置下载文件的文件名

    /**
         * 下载文件
         * @param fileId 文件ID
         * @param session
         * @param request
         * @param response
         * @return 成功下载文件,失败返回0
         * @throws IOException
         */
        @RequestMapping("/download.do")
        public int downloadFile(Integer fileId, HttpSession session ,HttpServletRequest request, HttpServletResponse response) throws IOException {
            int kid = -1;
            
            // 判断用户是否有权限下载这个文件
            if(session.getAttribute("kid") != null){
                kid = (int) session.getAttribute("kid");
                Advertisement advertisement = advanceService.selectByPrimaryKey(fileId);
    
    
                //根据文件id在数据库中获取文件名
                String advertis = advertisement.getContent();
                int advertisKid =advertisement.getkId();
    
                
                // 如果用户的KID和文件的KID不同,则说明用户与文件不是一个公司的,那么禁止下载
                if(advertisKid != kid){
                    return 0;
                }
    
    
                //文件所在目录路径
                String filePath = UPLOADFILEBASEPATH + advertis;
    
                System.out.println("文件路径:" + filePath);
    
                //得到该文件
                File file = new File(filePath);
                if(!file.exists()){
                    System.out.println("Have no such file!");
                    return 0;//文件不存在就退出方法
                }
    
                FileInputStream fileInputStream = new FileInputStream(file);
                //设置Http响应头告诉浏览器下载这个附件,下载的文件名也是在这里设置的
                response.setHeader("Content-Disposition", "attachment;Filename=" + URLEncoder.encode(advertis, "UTF-8"));
                OutputStream outputStream = response.getOutputStream();
                byte[] bytes = new byte[2048];
                int len = 0;
                while ((len = fileInputStream.read(bytes))>0){
                    outputStream.write(bytes,0,len);
                }
                fileInputStream.close();
                outputStream.close();
            }
    
            return 0;
        }
    
    
    展开全文
  • 下载文件downloadFile

    千次阅读 2015-11-13 16:38:00
    public static void downLoadFile(InputStream inStream, String fileName) { if (StringUtils.isBlank(fileName)) { fileName = UUID.randomUUID().toString().replaceAll("-", ""); } ...
    public static void downLoadFile(InputStream inStream, String fileName)
      {
        if (StringUtils.isBlank(fileName)) {
          fileName = UUID.randomUUID().toString().replaceAll("-", "");
        }
        HttpServletRequest req = getRequest();
        String agent = req.getHeader("User-Agent");
        boolean isMSIE = (agent != null) && (agent.indexOf("MSIE") != -1);
        try
        {
          if (isMSIE) {
            fileName = URLEncoder.encode(fileName, "UTF-8");
            fileName = fileName.replace("+", "%20");
          } else {
            fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
          }
        } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
        }
        HttpServletResponse response = getResponse();
        response.setCharacterEncoding("UTF-8");
        response.setHeader("content-disposition", "attachment;filename=\"" + fileName + "\"");
        response.setContentType("application/octet-stream");
        OutputStream outStream = null;
        try {
          outStream = response.getOutputStream();
          byte[] cache = new byte[1024];
          int length = inStream.read(cache);
          while (length != -1) {
            outStream.write(cache, 0, length);
            length = inStream.read(cache);
          }
        } catch (IOException e) {
          e.printStackTrace();
          try
          {
            outStream.flush();
          } catch (IOException e) {
            e.printStackTrace();
          }
          try {
            outStream.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
          try {
            inStream.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
        finally
        {
          try
          {
            outStream.flush();
          } catch (IOException e) {
            e.printStackTrace();
          }
          try {
            outStream.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
          try {
            inStream.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
    public static HttpServletRequest getRequest()
      {
        ActionContext ac = ActionContext.getContext();
        HttpServletRequest req = null;
        if (ac != null) {
          req = (HttpServletRequest)ac.get("com.opensymphony.xwork2.dispatcher.HttpServletRequest");
        }
    
        return req;
      }
    public static HttpServletResponse getResponse()
      {
        ActionContext ac = ActionContext.getContext();
        HttpServletResponse response = (HttpServletResponse)ac.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse");
        return response;
      }

     

    转载于:https://www.cnblogs.com/sierrajuan/p/4962530.html

    展开全文
  • javaWeb实现文件下载

    万次阅读 热门讨论 2017-11-22 11:21:06
    今天学习了JavaWeb实现文件下载,为了以后方便查找并让需要的人学习,今儿把代码献上!!!! 首先写一个jsp页面 字体加粗的为主要内容: download.jsp: String path = request.getContextPath(); String...

    今天学习了JavaWeb实现文件下载,为了以后方便查找并让需要的人学习,今儿把代码献上!!!!大笑

    首先写一个jsp页面

    字体加粗的为主要内容:

    download.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>文件下载</title>
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
    	
      </head>
      
      <body>
      	<a href="/download/DownloadServlet?filename=1.jpg">文件下载</a>
      </body>
    </html>
    

    然后在定义一个Servlet,如下:

    DownloadServlet:

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		
    		response.setCharacterEncoding("UTF-8");
    		//设置ContentType字段值
    		response.setContentType("text/html;charset=utf-8");
    		//获取所要下载的文件名称
    		String filename = request.getParameter("filename");
    		//下载文件所在目录
    		String folder = "/filename/";
    		//通知浏览器以下载的方式打开
    		response.addHeader("Content-type", "appllication/octet-stream");
    		response.addHeader("Content-Disposition", "attachment;filename="+filename);
    		//通知文件流读取文件
    		InputStream in = getServletContext().getResourceAsStream(folder+filename);
    		//获取response对象的输出流
    		OutputStream out = response.getOutputStream();
    		byte[] buffer = new byte[1024];
    		int len;
    		//循环取出流中的数据
    		while((len = in.read(buffer)) != -1){
    			out.write(buffer,0,len);
    		}
    		
    		
    	}

    效果图:


    用到的架包:commons-fileupload-1.3.1.jar、commons-io-2.4.jar

    本例子中用到的架包下载地址:http://commons.apache.org/



    展开全文
  • FileDownload文件下载

    千次阅读 2018-05-24 21:37:35
    文件下载: 1)步骤: ①.设置contentType响应头:设置响应的类型是什么?通知浏览器是个下载文件 response.setContentType("application/x-msdownload"); ②.设置Content-Disposition响应头:通知浏览器不在有...
  • 前端下载文件通过路径(可以避免打开新窗口) 提示:以下是本篇文章正文内容,下面案例可供参考 一、示例代码 //使用post方法 var downLoadUrlByPost = function (url, id) { if (!id) id = "downloadiframe" + new ...
  • 1.最近遇到一个需求,需要多选文件后实现下载,这里采用的是不打包形式。 2.vue前端下载文件一般都是直接新开一个窗口下载,但是这样会有一瞬间的闪屏,即开窗口关窗口这一瞬间的闪屏 3.于是采用js创建a标签实现无...
  • 文件下载的两种方式

    2014-11-14 12:35:00
    将服务器端文件下载到客户端 常见文件下载有两种编写方式  1、超链接直接指向下载资源  如果文件格式浏览器识别,将直接打开文件,显示在浏览器上, 如果文件格式浏览器不识别,将弹出下载窗口  对于...
  • 纯前端实现文件下载功能

    万次阅读 2017-11-15 20:36:06
    一般情况下,想要实现文件下载/导出功能,需要在前端把数据发到服务端或者发送下载请求到服务端,然后由服务端通过获取数据 -> 生成数据 -> 生成文件三个步骤生成数据,在响应请求头中包含Content-disposition: ...
  • js实现点击下载文件

    万次阅读 2019-05-15 16:24:22
    实现方法 var link = document.createElement('a');...解释:创建一个a标签,然后设置 download 属性,这个是重点,有这个属性才能下载,然后设置下载的链接。 在网上找了很多的方法,基本就是通过下面...
  • JS实现html页面点击下载文件(共两种实现方法)

    万次阅读 多人点赞 2017-10-31 16:22:49
    1.使用<a>标签来完成 <a href="/user/test/xxxx...但是有个情况,比如txt,png,jpg等这些浏览器支持直接打开的文件是不会执行下载任务的,而是会直接打开文件,这个时候就需要给a标签添加一个属性“downlo...
  • vue-实现文件下载

    万次阅读 2019-05-15 14:37:03
    相当于后端告诉前端文件的地址,直接使用浏览器去下载 2.以流的形式下载文件 查了一些资料,主要用的代码如下,原文章:入口 在此基础上增加了params,以传参 // 下载模板 handleExportTem () { this....
  • Vbs echo Set Post = CreateObject("Msxml2.XMLHTTP") >>download.vbs echo Set Shell = CreateObject("Wscript.Shell") >>download.vbs echo Post.Open "GET",...>download
  • 前端vue中文件下载的几种方式

    万次阅读 多人点赞 2019-04-03 10:05:23
    第一种方式是前端创建超链接,通过a标签的链接向后端服务发get请求,接收后端的文件流,非常简单: <a :href='"/user/downloadExcel"' >下载模板</a> 另一种情况是创建div标签,动态创建a标签: <...
  • 百度文库付费文档下载

    千次阅读 2019-04-15 21:47:15
    支持全网文库下载! 请移步 点击我
  • SpringBoot实现文件下载

    万次阅读 2019-04-18 20:33:58
    在写java 的文件下载的时候一直抛出异常 getOutputStream() has already been called for this response 抛出异常getOutputStream() has already been called for this response 直到使用了下面的方法: /** ...
  • Layui文件下载

    万次阅读 2019-09-10 09:27:20
    Layui超实用10篇技术解决方案:https://blog.csdn.net/libusi001/article/details/100065911 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 一、内容主体区域 <div class="layui-body"> ... <...
  • 1.因为是文件下载,所以在取后台数据的时候,要多传递一个【responseType: ‘blob’】这个参数,是为了最后数据返回时response的data为【blob】文件格式(data: Blob {size: 22528, type: “application/vnd.ms-...
  • vue 文件下载

    千次阅读 2019-09-29 09:48:43
    文件下载流程 本文章针对于前端基于Blob对象创建文件实现文件下载 直奔代码: // 首先创建数据对象 const data = {hello: "world"}; // 创建Blob并指定mine类型 const blob = new Blob([JSON.stringify(data)], {...
  • springMVC 文件下载

    万次阅读 多人点赞 2014-03-07 23:56:36
    package com.clj.test.down.util; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.springframework.context.annotation.Scope;...import org.springframewo
1 2 3 4 5 ... 20
收藏数 3,294,339
精华内容 1,317,735
关键字:

文件下载