高分:用java实现服务器上多个文件先打包,然后下载,下载完成后删除包!
向压缩包里添加文件时直接把服务器上的文件用流读进来就行,不用非把文件放到同一个目录,用程序生成压缩包和用命令行工具是不一样的,不要想当然。 写了个示例程序,你可以参考一下。这个示例不使用临时文件,把 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();
}
}
我用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());
}
js 做不到 copy 到客户端指定位置
如果说的是java的话, 可以做到
import javaioFileNotFoundException;import javaioFileOutputStream;
import javaioIOException;
import javaioInputStream;
import javanetMalformedURLException;
import javanetURL;
import javanetURLConnection;
/
文 件 名: Testjava
版 权: XX Technologies Co, Ltd Copyright YYYY-YYYY, All rights reserved
描 述: <描述>
修改时间: 2015-7-10
跟踪单号: <跟踪单号>
修改单号: <修改单号>
修改内容: <修改内容>
/
/
@version [版本号, 2015-7-10]
@see [相关类/方法]
@since [产品/模块版本]
/
public class Test
{
public static void main(String[] args)
{
try
{
URLConnection openConnection = new URL("服务器文件的访问地址")openConnection();
InputStream is = openConnectiongetInputStream();
byte[] buff = new byte[1024];
int len;
FileOutputStream fos = new FileOutputStream("c:\\你的文件名扩展名");
if (null != is)
{
while ((len = isread(buff)) != -1)
{
foswrite(buff, 0, len);
}
}
fosclose();
isclose();
}
catch (MalformedURLException e)
{
eprintStackTrace();
}
catch (FileNotFoundException e)
{
eprintStackTrace();
}
catch (IOException e)
{
eprintStackTrace();
}
}
}
public static void downloadFileFtp(KmConfig kmConfig,String fileName, String clientFileName, OutputStream outputStream){
try {
String ftpHost = kmConfiggetFtpHost();
int port = kmConfiggetFtpPort();
String userName = kmConfiggetFtpUser();
String passWord = kmConfiggetFtpPassword();
String path = kmConfiggetFtpPath();
FtpClient ftpClient = new FtpClient(ftpHost, port);// ftpHost为FTP服务器的IP地址,port为FTP服务器的登陆端口,ftpHost为String型,port为int型。
ftpClientlogin(userName, passWord);// userName、passWord分别为FTP服务器的登陆用户名和密码
ftpClientbinary();
ftpClientcd(path);// path为FTP服务器上保存上传文件的路径。
try {
TelnetInputStream in = ftpClientget(fileName);
byte[] bytes = new byte[1024];
int cnt=0;
while ((cnt=inread(bytes,0,byteslength)) != -1) {
outputStreamwrite(bytes, 0, cnt);
}
//##############################################
//这里文件就已经下载完了,自己理解一下
//#############################################
outputStreamclose();
inclose();
} catch (Exception e) {
ftpClientcloseServer();
eprintStackTrace();
}
ftpClientcloseServer();
} catch (Exception e) {
Systemoutprintln("下载文件失败!请检查系统FTP设置,并确认FTP服务启动");
}
}
/
文件下载
/
@RequestMapping("/downloadfile")
public void offLineResponseActiveFile(String resStr, HttpServletResponse response) {
PrintWriter pw = null;
StringBuffer sb = new StringBuffer();
try {
String fileName = "文件名";
responsesetCharacterEncoding("UTF-8");
responsesetContentType("application/x-msdownload");
responseaddHeader("Cache-Control", "no-cache, no-store, must-revalidate");
responseaddHeader("charset", "utf-8");
responseaddHeader("Pragma", "no-cache");
responsesetHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"; filename=utf-8''" + fileName );
sbappend(resStr);
pw = responsegetWriter();
pwwrite(sbtoString());
pwclose();
responseflushBuffer();
} catch (IOException e) {
loggerinfo("下载文件出错");
eprintStackTrace();
if (pw != null) {
pwclose();
}
} finally {
if (pw != null) {
pwclose();
}
}
}
resStr 字段传写入文件里的内容
0条评论