java怎样读取http文件服务器上的文件列表并下载?
把要下载的文件名存在数据库中,载入页面通过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;
}
}
0条评论