我有一个服务器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