怎样通过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实现服务器上文件下载?的主要内容,如果未能解决你的问题,请参考以下文章

java怎样读取http文件服务器上的文件列表并下载?

怎样使用java编程实现文件的剪切/移动

java中怎样调用现有的dll文件

怎样通过JSP页面上传个Excel文件,并实现Java读取EXCEL存入数据库

怎样用asp实现,下载指定网址文件,并重命名后保存到本地服务器上?

java怎样获取硬件设备传输过来的数据