我有一个服务器A,运行JFinal的系统,此时 A服务器的后面还有其他服务器如B,但是在A后面, 客户端浏览器无法直接访问B的 /downfile 服务地址。 我想在A服务器上写一个方法 /downloadB ,能不能实现forward的功能?
我利用sendRedirect是不通的,浏览器进行了跳转,无法下载B的文件
getResponse().setHeader("content-disposition", "attachment;filename=B.log"); getResponse().sendRedirect(" 最后还是自己动手,丰衣足食把, 自己写了一个StreamRender,把B的 inputstream流 直接导向到 当前response的 outputstream里面,就实现代理的功能, 这个与FileRender类似,但FileRender是针对已经存在的文件。 不废话了,献上代码 package cn.ct.ums.common; import com.jfinal.render.Render; import com.jfinal.render.RenderException; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import java.io.InputStream; import java.io.OutputStream; public class StreamRender extends Render { private String url; private String filename="downloadfile"; public StreamRender(String url) { this.url = url; } public StreamRender(String url,String fn) { this.url = url; this.filename = fn; } public void setFilename(String fn){ this.filename = fn; } @Override public void render() { response.setHeader("Content-disposition", "attachment; filename=" + filename); response.setContentType("application/octet-stream"); DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet get =new HttpGet(url); InputStream input = null; try { HttpResponse httpResponse = httpClient.execute(get); int i = httpResponse.getStatusLine().getStatusCode(); if(i==200){ input = httpResponse.getEntity().getContent(); OutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = input.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } outputStream.flush(); outputStream.close(); }else{ throw new RenderException("DownloadFail"); } } catch (Exception e) { throw new RenderException(e); } finally { if (input != null) { try {input.close(); } catch (Exception e) {} } } } }
但是你可能不希望客户直接访问 B 的 /downfile,一般要使用代理,也就是服务器 A 作为中转,与服务器 B 交互,将数据再转递给客户端,这个模式比较麻烦
我建议使用 jfinal 社区视频文件下载的方案,在这里有介绍:
https://jfinal.com/app/3