2 fmlzly fmlzly 于 2016.03.12 23:43 提问

java 如何进行对网络文件的中转

大神们,请教一个问题,如何中转网络文件?
比如说一个网络文件,在我的页面上提供下载入口(这个网络文件的下载地址),点击下载即可下载这个网络文件,但来源显示的是我的域名,不是网络文件原本的域名,也就是说我这里是中转,并非下载到我的服务器,是提供给别人下载(让人感觉来源是我这,而非其他网络上)
我尝试了先读取网络文件的数据流,然后再写出去。这个方法对网络文件比较小的可以实现,但对大的文件,就会消耗在读取文件流,卡住了。。下面是代码,求大神救助

/**
* 从输入流中获取字节数组
* @param inputStream
* @return
* @throws IOException
*/

public static byte[] readInputStream(InputStream inputStream) throws IOException {

byte[] buffer = new byte[1024];

int len = 0;

ByteArrayOutputStream bos = new ByteArrayOutputStream();

while((len = inputStream.read(buffer)) != -1) {

bos.write(buffer, 0, len);

    }    
    bos.close();    
    return bos.toByteArray();    
}    
/**
 * 附件下载
 */
public void downloadTaxpayer(HttpServletRequest request,HttpServletResponse response,String path){
    response.reset();//可以加也可以不加
    response.setContentType("application/x-download");//设置为下载application/x-download
    OutputStream output = null;
    //FileInputStream bis = null;
    BufferedInputStream bis = null;
    File file = null;
    try{            
        URL url = new URL(path);    
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();    
        //设置超时间为3秒  
        conn.setConnectTimeout(3*1000);  
        //防止屏蔽程序抓取而返回403错误  
        conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");  
        //得到输入流  
        InputStream inputStream = conn.getInputStream();    
        //获取自己数组  ========================这个位置读取大文件就会卡住了。
        byte[] getData = readInputStream(inputStream);  
        // 取得文件的后缀名。
        String filenamedisplay = path.substring(path.lastIndexOf("/") + 1).toUpperCase();
        file=new File(request.getSession().getServletContext().getRealPath("/")+"/pages/"+filenamedisplay); 
        filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");
        response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);
        FileOutputStream os = new FileOutputStream(file);
        os.write(getData);
        os.close();
        os = null;
        byte[] b = new byte[1024*512];
        output = response.getOutputStream();
        InputStream is = new FileInputStream(file);
        bis = new BufferedInputStream(is);
        int i = 0;
        while((i = bis.read(b)) > 0){
            output.write(b, 0, i);
        }
        output.flush();

    }catch (Exception e){
        e.printStackTrace();
    }
    finally{
        if(bis != null){
            try {
                bis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            bis = null;
        }
        if(output != null){
            try {
                output.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            output = null;
        }
        file.delete();
    }
}

2个回答

Smoke_1988
Smoke_1988   2016.03.12 23:53

java aio会不会好一些?

dcxy0
dcxy0   Ds   Rxr 2016.03.13 00:17

读取一次就存到你的服务器上,下次再下载的时候就直接从你服务器上取,其实你也可以直接把数据抓取到你的网站上。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
基于java的任务中转接口
在业务发展中,根据不同的业务需求,建立了不同的系统;系统间是相互独立的,为了避免信息孤岛,各系统通过对外提供接口进行交互;在众多的业务系统群中,通过点对点的接口交互存在很多弊端,系统间的接口交互混乱,不方便管理等等;采用SOA架构,ESB服务,又有点牛刀杀鸡;故设计了接口请求中转的组件;该组件接受各业务系统的报文请求,根据请求的交易码,去调用对应的组件处理;交易码和处理组件都配置在数据库中;
java httpclient https或http及文件中转上传工具类
该工具类使用httpclient进行http or https请求,包括requestbody格式和form表单格式,另外含文件服务器中转上传方法,几乎支持所有常用接口调用,内含详细注释和说明文件,含jar包,及maven方式引用,拿过去直接用吧
cz_m_a_p文件中转
文件中转,与他人无用文件中转,与他人无用文件中转,与他人无用文件中转,与他人无用
中转文件
患儿信息: 中国儿童呼吸运用现状调查 body { background-color: #CCC; } 中国儿童呼吸运用现状调查
【JAVA】java中转\\\斜杠
filePath=org.apache.commons.lang.StringUtils.replace(filePath,"\\","\\\\");
Java读取网络文件
输入url地址读取txt文件/** * Created by qqg on 2018/1/3. */ import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.net.H
java 发送http get post 请求,以及java通过httpclient中转上传文件
java 发送http get post 请求,以及java通过httpclient中转上传文件package com.websocket.common.http.util; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java....
在Java 7中如何对文件进行操作
创建文件 删除文件 复制文件 文件移动/改名 这篇文件是以你对Java7里提供的新的Path类很熟悉为前提,如果你不熟悉这个类,这里就简单说一句, Path 是文件系统里对位置的一个逻辑概念,例如 c: 和 ../foobar.txt 都是Path。 创建和删除文件 下面的代码片段向你展示的是用 Files.createFile(Path target) 方法创
在Java 7里如何对文件进行操作
下面的代码片段是由经过验证的程序修改而来。观察这些代码片段你会发现,跟以前的版本相比,在Java7里,文件相关的操作变得简单的多了。通过使用新的Files类里提供的各种方法,你可以只用一行代码就能完成下列的文件操作: 创建文件 删除文件 复制文件 文件移动/改名 这篇文件是以你对Java7里提供的新的Path类很熟悉为前提,如果你不熟悉这个类,这里就简单说一句,Path是文件系统里对位置
HttpClient中转上传文件
场景:客户端(浏览器)A---->选择文件上传---->服务器B---->中转文件---->服务器C---->返回结果---->服务器B---->客户端A 有时候在项目中需要把上传的文件中转到第三方服务器,第三方服务器提供一个接收文件的接口。 而我们又不想把文件先上传到服务器保存后再通过File来读取文件上传到第三方服务器,我们可以使用HttpClient来实现。 因为项目使用的