admin管理员组

文章数量:1533913

如何通过Java下载远程文件到浏览器

  1. 整体思路:
    首先获取远程资源的文件输入流,使用HttpServletResponse的输出流,通过Java io转换将输入流转成输出流,写入指定文件,下载到浏览器端。

  2. 前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图片下载</title>
</head>
<body>
<a id="downloadFileFromRemote" url="${url!}" fileSize="${fileSize!}" href="">文件下载</a>
</body>
</html>

```javascript
<script>
    //a标签的点击事件
    $("#downloadFileFromRemote").on("click",function(){
    	//获取a标签上参数值
        var url=$(this).attr("url");
        var fileSize=$(this).attr("fileSize");
        //方法一:该请求是get请求,当网络或远程图片url太长会被截断,需要使用form表单post请求
        $("#downloadFileFromRemote").attr("href","/getFile/downloadFileFromRemote?url="+url+"&fileSize="+fileSize)});
        //方法二:组装form,post提交,url不会被截取
        var form = $("<form>");
        form.attr("style","display:none");
        form.attr("method","post");
        form.attr("action","/getFile/downloadFileFromRemote");
        $("<body>").append(form);
        var input1 = $("<input>");
        input1.attr("type","hidden");
        input1.attr("name","url");
        input1.attr("value",url);
        form.append(input1);
        var input2 = $("<input>");
        input2.attr("type","hidden");
        input2.attr("name","fileSize");
        input1.attr("value",fileSize);
        form.append(input2);
        form.submit();

</script>

控制器:

@RequestMapping("/getFile/downloadFileFromRemote")
    public void getFile(String url, String fileSize, HttpServletResponse response) throws IOException {
       //生成随机文件名,这里指定下载jpg,可以从前端传入文件名,下载不同格式文件
        String fileName = new Random(1000).toString();
        fileName = fileName + ".jpg";
        FileUtils.downloadFromCmit(fileName,url,fileSize,response);
    }

下载工具类:

package com.xcwlkj.web.controller;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class FileUtils {

    public static void downloadFromCmit(String fileName,String urlStr, String fileSize, HttpServletResponse response) throws IOException {
        OutputStream out = null;
        ByteArrayOutputStream bas = null;
        InputStream is = null;

        try {
            response.reset();
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/octet-stream; charset=utf-8");
            String fileNam = URLEncoder.encode(fileName, "UTF-8");
            response.setHeader("Content-Disposition","attachment;filename="+fileNam);
            out = response.getOutputStream();
            URL url = new URL(urlStr);
            int fileLen = Integer.parseInt(fileSize);
            HttpURLConnection connection=(HttpURLConnection)url.openConnection();
            connection.setDoOutput(false);
            connection.setDoInput(true);
            connection.setRequestMethod("GET");
            connection.setUseCaches(true);
            connection.setInstanceFollowRedirects(true);
            connection. setConnectTimeout(3000);
            connection.connect();
            int code = connection.getResponseCode();
            if(code==200){
                is = connection.getInputStream();
                byte[] b = new byte[1024];
                bas = new ByteArrayOutputStream();
                int len;
                while((len=is.read(b))!=-1){
                    bas.write(b,0,len);
                }
                byte[] src = bas.toByteArray();
                byte[] dest = new byte[fileLen];
                System.arraycopy(src,0,dest,0,fileLen);
                out.write(dest);
                out.flush();

            }
            connection.disconnect();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //先关闭外层,后里层
            out.close();
            bas.close();
            is.close();

        }
    }
}

本文标签: 浏览器文件Java