原因:就目前找到的资料wap网关限制大文件的下载,是因为wap网关在手机客户端拿到文件之前就已经知道要下载的文件大小,这是因为文件的大小从http协议中可以得到,http头中保存的不止文件的大小,还有文件的类型等一些列信息,按照现在的猜测,网关限制大文件下载是根据文件的content-length来判断文件的大小。
解决思路:在wap网关和文件服务器之间加一层代理服务器,网关请求过来只到代理服务器,而不会到真正访问到你的资源你服务器。代理服务器按照客户端的请求参数每次去文件服务器上拿取文件。
技术关键点:
1. 代理服务器与文件服务器之间连接的建立
2. 输入流和输出流,字节偏移量的设定(代理服务器)
3. 代理服务器输出文件类型
代码实现:
public class DownServlet extends HttpServlet {
private static final long serialVersionUID = 1332534778678L;
private static final int byte_size = 1024;
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentLength(byte_size); // 输出到客户端的文件大小
String fileName = "default.dmh";
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment; filename="
+ fileName); // 设置文件头
String url = request.getParameter("url");
URL fileUrl = new URL(url);
HttpURLConnection httpCon = (HttpURLConnection) fileUrl
.openConnection();
// System.out.println("before range.......... "+httpCon.getResponseCode());
String sProperty = "bytes=10-" + byte_size; // -后面表示要取多少数据
httpCon.setRequestProperty("RANGE", sProperty); // 设置偏移量
System.out.println("after range.......... "+httpCon.getResponseCode());
InputStream in = httpCon.getInputStream();
System.out.println("after InputStream.......... "+httpCon.getResponseCode());
DataInputStream dis = new DataInputStream(in); // 重新包装输入流
OutputStream out = response.getOutputStream(); // 从httpUrlConnecction中获得输出流
byte[] b = new byte[byte_size]; // 读取多少
dis.read(b);
out.write(b);
out.flush();
out.close(); // 关闭输入输出流
dis.close();
in.close();
}
}
出现问题:
1. 设置偏移量对文件服务器不起作用
经过测试发现只有代理服务器请求文件服务器上的静态文件时,设置偏移量才能使用,请求动态的则不行,猜测原因是请求动态的文件是因为设置的一些底层的参数到不了服务器底层,如:apache等。
2. 设置偏移量“-”后的大小
“-”后设置多少表是此次请求从偏移量之后取多少数据,此过程会限制httpCon.getInputStream()的大小,在使用read读取时读取的大小就是“-”后的大小,若读取过大则在后面补空格。
解决思路:在wap网关和文件服务器之间加一层代理服务器,网关请求过来只到代理服务器,而不会到真正访问到你的资源你服务器。代理服务器按照客户端的请求参数每次去文件服务器上拿取文件。
技术关键点:
1. 代理服务器与文件服务器之间连接的建立
2. 输入流和输出流,字节偏移量的设定(代理服务器)
3. 代理服务器输出文件类型
代码实现:
public class DownServlet extends HttpServlet {
private static final long serialVersionUID = 1332534778678L;
private static final int byte_size = 1024;
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentLength(byte_size); // 输出到客户端的文件大小
String fileName = "default.dmh";
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment; filename="
+ fileName); // 设置文件头
String url = request.getParameter("url");
URL fileUrl = new URL(url);
HttpURLConnection httpCon = (HttpURLConnection) fileUrl
.openConnection();
// System.out.println("before range.......... "+httpCon.getResponseCode());
String sProperty = "bytes=10-" + byte_size; // -后面表示要取多少数据
httpCon.setRequestProperty("RANGE", sProperty); // 设置偏移量
System.out.println("after range.......... "+httpCon.getResponseCode());
InputStream in = httpCon.getInputStream();
System.out.println("after InputStream.......... "+httpCon.getResponseCode());
DataInputStream dis = new DataInputStream(in); // 重新包装输入流
OutputStream out = response.getOutputStream(); // 从httpUrlConnecction中获得输出流
byte[] b = new byte[byte_size]; // 读取多少
dis.read(b);
out.write(b);
out.flush();
out.close(); // 关闭输入输出流
dis.close();
in.close();
}
}
出现问题:
1. 设置偏移量对文件服务器不起作用
经过测试发现只有代理服务器请求文件服务器上的静态文件时,设置偏移量才能使用,请求动态的则不行,猜测原因是请求动态的文件是因为设置的一些底层的参数到不了服务器底层,如:apache等。
2. 设置偏移量“-”后的大小
“-”后设置多少表是此次请求从偏移量之后取多少数据,此过程会限制httpCon.getInputStream()的大小,在使用read读取时读取的大小就是“-”后的大小,若读取过大则在后面补空格。