怎样通过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,就更方便了。 可以传一个文件路径的参数,就可以根据请求的路径,来下载服务器上的文件了。。。 而且如果用迅雷等下载工具,可以支持断点续传和多线程下载!

追问

我要自定义下载后的存放路径,不是源文件路径,你这个实现不了。

追答

下载的路径是你自己选的。就跟你在别的网站下载文件一样,会弹出提示,要你选择保存的路径!

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-12
用HttpClient(commons httpclient)包,模拟一个Get请求,发送到网址172.16.30.230/文件地址。这个文件地址不能是E/Map/123.txt,必须是暴露在服务器中的应用里的。就像你写的应用里的一个jsp页面的目录。
成功发送get请求后,就会得到response,里面有流。就是你下载的文件,然后可以通过FileOutputStream,指定你输出目录,写到磁盘上。追问

能用代码实现以下吗?麻烦了,大侠!

追答

这个现在没有条件。。。。你可以尝试写一下。。。不是很难。。

追问

我搞两天了,别人访问我的机器都下到我自己的电脑里了,实在是恶心了。。。qq方便留一下吗?

第2个回答  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记事本小文件,估计一瞬间就传完了,也不用在乎什么进度条了.
楼主试试看吧.
第3个回答  2013-10-12
用HttpClient(commons httpclient)包,模拟一个Get请求,发送到网址172.16.30.230/文件地追问

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

怎样通过java实现服务器上文件下载?
用HttpClient(commonshttpclient)包,模拟一个Get请求,发送到网址172.16.30.230\/文件地址。这个文件地址不能是E\/Map\/123.txt,必须是暴露在服务器中的应用里的。就像你写的应用里的一个jsp页面的目录。成功发送get请求后,就会得到response,里面有流。就是你下载的文件,然后可以通过FileOutputStream,...

用java实现文件的上传与下载
1.下载简单,无非是把服务器上的文件或者数据库中的BLob(或其他二进制型),用流读出来,然后写到客户端即可,要注意 ContentType。2.上传,可以用Apache Commons Upload等开源工具,或者自己写:form要用enctype="multipart\/form-data"然后服务器端也是用IO把客户端提交的文件流读入,然后写到服务器的...

java怎样读取http文件服务器上的文件列表并下载?
把要下载的文件名存在数据库中,载入页面通过servlet或者action或者采用javaBean读取数据库数据,然后遍历出来,再通过servlet或者action的outputstream下载即可

java 如何下载文件?
1.首先struts2.xml 里面 <action name="download" class="com.zfj.action.DownloadAction"> <!-- 注意这里不再是返回一个字符串找到一个页面了 从服务器返回到本地客户端是一个流 我们需要配置流信息 type:表示接受方式或者跳转方法是 默认是 dispatcher 请求转发,所以之前我们一般不书写这个参数但...

服务器上的文件Java获取Linux服务器文件简单又高效的操作方法java获取lin...
Java NIO可以为我们提供顺序和异步的I\/O数据的操作支持,且将Linux服务器文件获取的问题变得简单惊人。具体实现步骤如下:1. 构建Linux服务器文件路径:确定需要操作的文件路径,构建本地存储路径,读取Linux服务器文件到本地存储路径。2. 通过java NIO类库支持,读取Linux服务器上指定文件 ...

java web项目,文件保存在服务器硬盘上,那要下载某个文件的思路是什么...
如果文件在硬盘上,必须得有固定的方法获取文件的路径。或者DB中,或者配置文件,或者固定的方式生成。之后读进来,输出到流,浏览器接受即可

怎么使用Java完成下载excel文件,服务器上excel文件是直接存在的而不是...
写个文件专门提供下载文件也可以,但那样对于你这种情况明显多余了,把服务器端Excel文件的MIME类型映射信息改成application\/octet-stream即可。这个映射可以在web.xml中定义。

java代码实现从svn服务器下载文件到本地
首先你要安装svn客户端,安装完成以后你右键选择svn中的import,输入你服务器端代码的地址,下载路径什么的自己配置,其他不用管,点击OK就可以了,不过你要有read权限才行。

用Java的三大框架实现文件的上传下载,求代码啊,最好是分为action,servi...
if (upload == null) { \/\/ 通过xml配置 required校验器 完成校验 \/\/ 没有上传文件 return NONE;} \/\/ 将上传文件 保存到服务器端 \/\/ 源文件 upload \/\/ 目标文件 File destFile = new File(ServletActionContext.getServletContext().getRealPath("\/upload") + "\/" + uploadFileName);\/\/ ...

linux服务器上部署java项目,本地windos通过浏览器访问项目怎么下载项 ...
既然使用了java,实现这种功能就与OS无关了,否则叫什么跨平台。其实用浏览器下载服务器端文件比较容易:首先,要让用户能找到并选择文件(jsp里实现,部分代码)String realPath=request.getSession().getServletContext().getRealPath("")+"\/documents";\/\/项目根目录下文件路径 File fileDir=new File(...

相似回答