怎样通过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协议,要怎么实现?求高手指点。 展开
 我来答
kevintop3
2013-10-12 · TA获得超过1.5万个赞
知道小有建树答主
回答量:890
采纳率:100%
帮助的人:535万
展开全部

在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,就更方便了。 可以传一个文件路径的参数,就可以根据请求的路径,来下载服务器上的文件了。。。 而且如果用迅雷等下载工具,可以支持断点续传和多线程下载!
lihongzheshuai
2013-10-12 · 超过19用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:53.7万
展开全部
用HttpClient(commons httpclient)包,模拟一个Get请求,发送到网址172.16.30.230/文件地址。这个文件地址不能是E/Map/123.txt,必须是暴露在服务器中的应用里的。就像你写的应用里的一个jsp页面的目录。
成功发送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记事本小文件,估计一瞬间就传完了,也不用在乎什么进度条了.
楼主试试看吧.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
happy2012zjh
2013-10-12 · TA获得超过273个赞
知道小有建树答主
回答量:1197
采纳率:100%
帮助的人:517万
展开全部
用HttpClient(commons httpclient)包,模拟一个Get请求,发送到网址172.16.30.230/文件地
追问

不知道你怎么得的,照着一楼复制的,词都没复制全,唉!

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式