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

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

把要下载的文件名存在数据库中,载入页面通过servlet或者action或者采用javaBean读取数据库数据,然后遍历出来,再通过servlet或者action的outputstream下载即可

我用struts2给你实现:

1首先struts2xml 里面

<action name="download" class="comzfjactionDownloadAction">

<!-- 注意这里不再是返回一个字符串找到一个页面了

从服务器返回到本地客户端是一个流 我们需要配置流信息

type:表示接受方式或者跳转方法是

默认是 dispatcher 请求转发,所以之前我们一般不书写这个参数但是这里需要更改为stream重定向

-->

<result type="stream">

<!--

因为之前我们设置的execute方法返回一个String,但是我们现在需要返回一个流。这里我们要指定一个新的方法为我们处理业务逻

辑并且返回流所以默认execute 方法对我们没有作用了,在这里我们指定一个新的方法为我们处理业务逻辑并且最后返回流

这里的inputName是固定写法 后面的名字dname要跟 action里面的getDname对应

-->

<param name="inputName">dname</param>

<!-- 当流返回过来时,我们应当设置头信息

给浏览器,这里设置的都是流信息

name里面的是固定写法

attachment:表示使用附件下载

online:直接打开

分号后的filename是固定写法,后面通过一个ognl表达式

引用下载的文件名

-->

<param name="contentDisposition">attachment;filename=${filename}</param>

</result>

</action>

这里不再是返回一个字符串找到一个页面了。从服务器返回到本地客户端是一个流,我们需要配置流信息。

type:表示接受方式或者跳转方式是(默认是dispathcher请求转发,所以之前我们一般不书写这个,但是这里下载需要更改stream)

2对应的DownloadAction

@Override

public String execute() throws Exception {

return thisSUCCESS;

}

//这里的getEtoak要跟strutsxml里的inputName的值对应

public InputStream getEtoak() throws Exception {

return new FileInputStream(

ServletActionContextgetServletContext()

getRealPath("/image")

+ "/"

+ thisgetFilename());

}

那就是ftp喽,首先要有个ftp服务器

提供两种思路:

1将ftp脚本写入bat文件中,然后程序去执行这个批处理;

2用jdk中net包下的api;还有一个雷同的就是下个apche的一个common-netjar的一个依赖包

GET <服务端:下载的档名> <本地端:存放的档名>

PUT <本地端:上传的档名> <服务端:存放的档名>

下载:

ex:从服务器端下载一个档名为 linuxrar 的文件到本地路径 C:\,存放档名为 LINUX_SRAR。

ftp> get linuxrar c:\LINUX_SRAR

上传:

ex:从本地端路径 C:\ 上传一个档名为 LINUX_SRAR 的文件到服务器,存放档名为 linuxrar。

ftp> put c:\LINUX_SRAR linuxrar

文件上传到A以后 放到服务器上面 然后他就有一个绝对的访问路径 也就是对应一个绝对的url 这样就好办了

Java提供了对URL访问和大量的流操作的的API,可以很容易的完成对网络上资源的存取,下面的代码段就完成了对一个网站的资源进行访问:

destUrl="http://wwwyourwebcom/java/Afilezip";

//假设你把文件放到webroot底下的java文件里面

url = new URL(destUrl);

httpUrl = (HttpURLConnection) urlopenConnection();

//连接指定的网络资源

httpUrlconnect();

//获取网络输入流

bis = new BufferedInputStream(httpUrlgetInputStream());

得到流后下面你自己想怎么操作就怎么操作了

对于怎么得到资源的连接地址这个方法很多 你可以专门提供一个Servlet 获取到输出的流后 Responsewrite转门提供服务器已上传的文件 文件名可以一天位单位返回

客户端用与上面同样的方法得到文件名后 拆分 然后再继续循环调用上面的方法 下载文件就ok了

呵呵 希望可以帮助到你

你的服务器是什么规范?HTTP?FTP?还是说要顺便写一个服务端出来?

如果是要写服务端的,自己搜索,网上有。

如果是HTTP协议和FTP协议的,java版本的见代码

InputStream ios=new URL("http://19216811/文件bomzip所在的WEB目录/bomzip")openConnection()getInputStream();

BufferedOutputStream bout=new BufferedOutputStream(new FileOutputStream("c:/存放目录/bomzip"));

byte buff[]=new byte[1024];

int count;

while((count=iosread(buff))>0){

boutwrite(buff, 0, count);

}

iosclose();

boutclose();

如果要C的话,用socket做,看一下HTTP协议规范,很简单可以做到文件传输的。

向压缩包里添加文件时直接把服务器上的文件用流读进来就行,不用非把文件放到同一个目录,用程序生成压缩包和用命令行工具是不一样的,不要想当然。 写了个示例程序,你可以参考一下。这个示例不使用临时文件,把 OutputStream os替换成你下载用的输出流就可以实现一边压缩一边下载。注意javautilzip不支持非ascii文件名。想支持中文文件名可以用apache ant或其他的库。

import javaio;

import javautilzipZipEntry;

import javautilzipZipOutputStream;

public class ZipTest {

public static void main( String[] args ) {

try {

writeZip();

} catch ( IOException e ) {

eprintStackTrace();

}

}

private static void writeZip() throws IOException {

String[] files = { "/ws/dir1/file1", "/ws/dir2/file2", "/ws/file3", "/pub/successwav" };

OutputStream os = new BufferedOutputStream( new FileOutputStream( "/ws/archivezip" ) );

ZipOutputStream zos = new ZipOutputStream( os );

byte[] buf = new byte[8192];

int len;

for ( String filename : files ) {

File file = new File( filename );

if ( !fileisFile() ) continue;

ZipEntry ze = new ZipEntry( filegetName() );

zosputNextEntry( ze );

BufferedInputStream bis = new BufferedInputStream( new FileInputStream( file ) );

while ( ( len = bisread( buf ) ) > 0 ) {

zoswrite( buf, 0, len );

}

zoscloseEntry();

}

zosclose();

}

}

package cnitcaststruts2demo1;

import javaioFile;

import orgapachecommonsioFileUtils;

import orgapachestruts2ServletActionContext;

import comopensymphonyxwork2ActionSupport;

/

完成文件上传 (不是解析上传内容,因为上传内容 由fileUpload拦截器负责解析)

@author seawind

/

public class UploadAction extends ActionSupport {

// 接收上传内容

// <input type="file" name="upload" />

private File upload; // 这里变量名 和 页面表单元素 name 属性一致

private String uploadContentType;

private String uploadFileName;

public void setUpload(File upload) {

thisupload = upload;

}

public void setUploadContentType(String uploadContentType) {

thisuploadContentType = uploadContentType;

}

public void setUploadFileName(String uploadFileName) {

thisuploadFileName = uploadFileName;

}

@Override

public String execute() throws Exception {

if (upload == null) { // 通过xml配置 required校验器 完成校验

// 没有上传文件

return NONE;

}

// 将上传文件 保存到服务器端

// 源文件 upload

// 目标文件

File destFile = new File(ServletActionContextgetServletContext()

getRealPath("/upload") + "/" + uploadFileName);

// 文件复制 使用commons-io包 提供 工具类

FileUtilscopyFile(upload, destFile);

return NONE;

}

}

多文件上传

package cnitcaststruts2demo1;

import javaioFile;

import orgapachecommonsioFileUtils;

import orgapachestruts2ServletActionContext;

import comopensymphonyxwork2ActionSupport;

/

支持多文件上传

@author seawind

/

public class MultiUploadAction extends ActionSupport {

// 接收多文件上传参数,提供数组接收就可以了

private File[] upload;

private String[] uploadContentType;

private String[] uploadFileName;

public void setUpload(File[] upload) {

thisupload = upload;

}

public void setUploadContentType(String[] uploadContentType) {

thisuploadContentType = uploadContentType;

}

public void setUploadFileName(String[] uploadFileName) {

thisuploadFileName = uploadFileName;

}

@Override

public String execute() throws Exception {

for (int i = 0; i < uploadlength; i++) {

// 循环完成上传

File srcFile = upload[i];

String filename = uploadFileName[i];

// 定义目标文件

File destFile = new File(ServletActionContextgetServletContext()

getRealPath("/upload" + "/" + filename));

FileUtilscopyFile(srcFile, destFile);

}

return NONE;

}

}

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » java怎样读取http文件服务器上的文件列表并下载?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情