怎样通过java实现服务器上文件下载?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样通过java实现服务器上文件下载?相关的知识,希望对你有一定的参考价值。
比如说服务器(172.16.30.230)上的E/map/123.txt,想要通过java下载到本机(172.16.11.243)的C/map/123.txt,不通过ftp协议,要怎么实现?求高手指点。
在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,就更方便了。 可以传一个文件路径的参数,就可以根据请求的路径,来下载服务器上的文件了。。。 而且如果用迅雷等下载工具,可以支持断点续传和多线程下载!追问
我要自定义下载后的存放路径,不是源文件路径,你这个实现不了。
追答下载的路径是你自己选的。就跟你在别的网站下载文件一样,会弹出提示,要你选择保存的路径!
参考技术A 用HttpClient(commons httpclient)包,模拟一个Get请求,发送到网址172.16.30.230/文件地址。这个文件地址不能是E/Map/123.txt,必须是暴露在服务器中的应用里的。就像你写的应用里的一个jsp页面的目录。成功发送get请求后,就会得到response,里面有流。就是你下载的文件,然后可以通过FileOutputStream,指定你输出目录,写到磁盘上。追问
能用代码实现以下吗?麻烦了,大侠!
追答这个现在没有条件。。。。你可以尝试写一下。。。不是很难。。
追问我搞两天了,别人访问我的机器都下到我自己的电脑里了,实在是恶心了。。。qq方便留一下吗?
参考技术B 感觉楼上几位说的办法都是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记事本小文件,估计一瞬间就传完了,也不用在乎什么进度条了.
楼主试试看吧. 参考技术C 用HttpClient(commons httpclient)包,模拟一个Get请求,发送到网址172.16.30.230/文件地追问
不知道你怎么得的,照着一楼复制的,词都没复制全,唉!
以上是关于怎样通过java实现服务器上文件下载?的主要内容,如果未能解决你的问题,请参考以下文章
怎样通过JSP页面上传个Excel文件,并实现Java读取EXCEL存入数据库