有两个服务器。
一个a服务器。
上tomcat配置,
一个action用SmartUpload下载文件
比如:
url为 http://a/download.jsp?id=123456
这个jsp写的是
SmartUpload su = new SmartUpload();   
su.initialize(pageContext);     
su.setContentDisposition(null);
su.downloadFile(d:/temp/123456.txt,"您的文件.txt");
另外一个b服务器
也是tomcat配置。
url为 http://b/
我想通过b服务器的一个页面去a下载比如b服务器上有个jsp页面。
http://b/download.jsp这个页面会访问http://a/download.jsp?id=123456这个URL。
这样访问http://b/download.jsp 就是下载的a的文件。
问题是, 这样, b的用户就可以看到a服务器的域名或者URL了。 
我不想让b的用户看到文件是从a下载的。 该怎么写这个代码!?我先谢谢大家, baidu了很长时间也不得其解。

解决方案 »

  1.   

    B上的JSP通过URLConnection去连接A上的文件,然后得到InputStream,从里面读取数据,写入通向客户端的OutputStream。http://www.forjj.com/?action=show&id=51根据这里的代码自己改吧。主要改动的地方就是去掉那几行输出字符的代码(out.println的代码),加上下载的响应头,与将
    outS这个输出流改成向客户端的输出流。。BufferedOutputStream outS = new BufferedOutputStream(response.getOutputStream());
      

  2.   

    这个办法我想过,有一点不足就是:1. 我不知道我下载的文件名是什么格式的,我只知道一个id。 
       下载服务器通过请求过来的id来确定文件是什么文件。2. 如果这样实现, 就相当于我先从a服务器取得文件,存到我的b服务器上, 然后通过b在提供给客户。 有点繁琐了。 3. 没有人提到用Proxy模式来请求一个链接?
      

  3.   

    如果你的硬盘够大的话是否可以模拟代理的方式。
    1.建立一个表用来存储Url和本机文件的映射
    2.接到请求后从表中查询本地是否有文件缓存,若有直接将缓存文件给用户,若没有
      将用户的下载链redirect到别处,然后自己也去下载,并更新映射表这样的好处就是可以自己学习、收集文件,而且只有第一个用户能看到真实的地址。
    缺点就是硬盘耗费太大.
    19楼的方法很巧妙值得试验下
      

  4.   

    用forward不是可以隐藏真实地址的吗?
      

  5.   

    IP不一样 你用c# 实现下
      

  6.   

    这个帖子的代码几乎就可以解决你的问题了
    http://www.cnblogs.com/treeyh/archive/2009/03/06/1404401.html
    只需要简单的修改,把 OutputStream os = new FileOutputStream(filename);  
    换成requtst.getOutputStream();然后再设置下jsp的几个header就可以了
      

  7.   


    这位朋友, 不知道jsp的head怎么设置?
      

  8.   

    在A那边把文件压强成rar统一格式,然后A充当文件下载服务器。
    然后用B请求直接下载,B就相当于一个文件中转站,再高一层就是逻辑处理机,A就算是持久。。URL urlObj = new URL("http://a/download.jsp?id=123456");
    InputStream ins = urlObj.openConnection().getInputStream();response.setContentType("application/octet-stream");
    String headerStr = "attachment; filename=" + new Random().nextInt() + ".rar";
    response.setHeader("Content-Disposition", );
    byte[] buffer = new byte[1024 * 128];
    int index = 0;
    OutputStream outStream = response.getOutputStream();
    while ((index = ins.read(buffer)) != -1) {
       outStream.write(buffer,0,index);
    }
    ins.close();
    outStream.flush();
    outStream.close();
      

  9.   

    URL urlObj = new URL("http://-a/download.jsp?id=123456");
    InputStream ins = urlObj.openConnection().getInputStream();response.setContentType("application/octet-stream");
    String headerStr = "attachment; filename=" + new Random().nextInt() + ".rar";
    response.setHeader("Content-Disposition", );
    byte[] buffer = new byte[1024 * 128];
    int index = 0;
    OutputStream outStream = response.getOutputStream();
    while ((index = ins.read(buffer)) != 1) {
       outStream.write(buffer,0,index);
    }
    ins.close();
    outStream.flush();
    outStream.close();
      

  10.   

    目前你就是希望在a站点下载的url不要给b知道,那么你可以对a站点进行url重写嘛。
    http://a/download.jsp?id=123456
    你通过jsp重写到http://c/download123-123456.html,这样别人不就看不到服务器是a还是其他了咯
    你去查找一下关于url重写方面的资料。很简单的。
      

  11.   

    太感谢你们了。 我已经解决了这个问题。 前提是必须要知道a服务器的文件名。不然还是不能解决。
    此处贴出方法:<%@ page language="java" import="java.io.*, java.net.*" pageEncoding="UTF-8"%><%
    String URL = (String)request.getAttribute("URL");
    String fileName = (String)request.getAttribute("fileName");
    URL url = new URL(URL);
    URLConnection conn = url.openConnection();
    InputStream is = conn.getInputStream();  
    ByteArrayOutputStream d = new ByteArrayOutputStream();
    response.setHeader("Content-disposition", "attachment;filename="+fileName+"" );
    int len;  
    byte[] bs = new byte[8196]; 
    while ((len = is.read(bs)) != -1) {  
    d.write(bs, 0, len);
    }
    d.writeTo(response.getOutputStream());
    is.close();
    %>
      

  12.   

    如果是window的服务器,你只要把A机器的TEMP目录在B机器上建立一个映射,就可以直接在B机器上像操作自己文件一样,让用户下载A机器的文件了。