怎样通过java实现服务器上文件下载? 30
比如说服务器(172.16.30.230)上的E/map/123.txt,想要通过java下载到本机(172.16.11.243)的C/map/123.txt,不通过ft...
比如说服务器(172.16.30.230)上的E/map/123.txt,想要通过java下载到本机(172.16.11.243)的C/map/123.txt,不通过ftp协议,要怎么实现?求高手指点。
展开
4个回答
展开全部
在jsp/servlet中断点/多线程下载文件
<%@ page import="java.io.File" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.RandomAccessFile" %>
<%!
public void downloadFile(HttpServletRequest request, HttpServletResponse response, File file) throws IOException {
RandomAccessFile raf = new RandomAccessFile(file, "r");
java.io.FileInputStream fis = new java.io.FileInputStream(raf.getFD());
response.setHeader("Server", "www.trydone.com");
response.setHeader("Accept-Ranges", "bytes");
long pos = 0;
long len;
len = raf.length();
if (request.getHeader("Range") != null) {
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
pos = Long.parseLong(request.getHeader("Range")
.replaceAll("bytes=", "")
.replaceAll("-", "")
);
}
response.setHeader("Content-Length", Long.toString(len - pos));
if (pos != 0) {
response.setHeader("Content-Range", new StringBuffer()
.append("bytes ")
.append(pos)
.append("-")
.append(Long.toString(len - 1))
.append("/")
.append(len)
.toString()
);
}
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", new StringBuffer()
.append("attachment;filename=\"")
.append(file.getName())
.append("\"").toString());
raf.seek(pos);
byte[] b = new byte[2048];
int i;
OutputStream outs = response.getOutputStream();
while ((i = raf.read(b)) != -1) {
outs.write(b, 0, i);
}
raf.close();
fis.close();
}
%>
<%
String filePath = request.getParameter("file");
filePath = application.getRealPath(filePath);
File file = new File(filePath);
downloadFile(request, response, file);
%>
更多追问追答
追问
这个,输出路径是什么啊?我想设置一个自定义的路径,用来存放下载下来的文件,要怎么设置啊?
追答
你访问这个JSP页面,它就会弹出下载的链接,然后会通过浏览器提示你保存,你可以选择保存的位置 。
另外你可以把里面的代码扣出来,写成一个Servlet,就更方便了。 可以传一个文件路径的参数,就可以根据请求的路径,来下载服务器上的文件了。。。 而且如果用迅雷等下载工具,可以支持断点续传和多线程下载!
展开全部
用HttpClient(commons httpclient)包,模拟一个Get请求,发送到网址172.16.30.230/文件地址。这个文件地址不能是E/Map/123.txt,必须是暴露在服务器中的应用里的。就像你写的应用里的一个jsp页面的目录。
成功发送get请求后,就会得到response,里面有流。就是你下载的文件,然后可以通过FileOutputStream,指定你输出目录,写到磁盘上。
成功发送get请求后,就会得到response,里面有流。就是你下载的文件,然后可以通过FileOutputStream,指定你输出目录,写到磁盘上。
更多追问追答
追问
能用代码实现以下吗?麻烦了,大侠!
追答
这个现在没有条件。。。。你可以尝试写一下。。。不是很难。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-08-09
展开全部
感觉楼上几位说的办法都是http协议,走的是jsp网站路线,也不失为一种可选的不错的办法.既然是jsp建站了,那也不妨再省事一些.http协议毕竟稳定性和速度较弱,改为websocket协议更佳.
再延伸一步,websocket协议对浏览器版本的要求太高,IE10以上才能带起来,怕你的浏览器版本达不到.可以换用Amf3协议,把jsp网页内植入一个flash小组件,让java和actionscript之间直接通信.
要么,抛开jsp站点不谈,只看底层的文件传输,就用tcp协议.你去服务器上弄个socketServer,你在本机弄个socket,两边对准了端口号,直接把文件抓下来算了.这个办法想必是最迎合你的提问的.你本来就是只想通过java语言传输,没考虑过弄jsp网站,没考虑过要牵扯到太多其它的语言,什么html, css, javascript, xml的.大家都知道,一旦建站,冒出来的语言就多了,就化简为繁了.
总起来说,不管怎么通信,走的皆是字节流,其实也就是字节数组byte[].把数组当作参数,从服务器端的socket写进去objectOutputStream.writeObject (array); objectOutputStream.flush ();再从你本机的socket读出来objectInputStream.readObject ();反正就是个txt记事本小文件,估计一瞬间就传完了,也不用在乎什么进度条了.
楼主试试看吧.
再延伸一步,websocket协议对浏览器版本的要求太高,IE10以上才能带起来,怕你的浏览器版本达不到.可以换用Amf3协议,把jsp网页内植入一个flash小组件,让java和actionscript之间直接通信.
要么,抛开jsp站点不谈,只看底层的文件传输,就用tcp协议.你去服务器上弄个socketServer,你在本机弄个socket,两边对准了端口号,直接把文件抓下来算了.这个办法想必是最迎合你的提问的.你本来就是只想通过java语言传输,没考虑过弄jsp网站,没考虑过要牵扯到太多其它的语言,什么html, css, javascript, xml的.大家都知道,一旦建站,冒出来的语言就多了,就化简为繁了.
总起来说,不管怎么通信,走的皆是字节流,其实也就是字节数组byte[].把数组当作参数,从服务器端的socket写进去objectOutputStream.writeObject (array); objectOutputStream.flush ();再从你本机的socket读出来objectInputStream.readObject ();反正就是个txt记事本小文件,估计一瞬间就传完了,也不用在乎什么进度条了.
楼主试试看吧.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询