高分:用java实现服务器上多个文件先打包,然后下载,下载完成后删除包!

高分:用java实现服务器上多个文件先打包,然后下载,下载完成后删除包!,第1张

向压缩包里添加文件时直接把服务器上的文件用流读进来就行,不用非把文件放到同一个目录,用程序生成压缩包和用命令行工具是不一样的,不要想当然。 写了个示例程序,你可以参考一下。这个示例不使用临时文件,把 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 comweixinutil;

import javaioFile;

import javaioFileOutputStream;

import javaioIOException;

import javaioInputStream;

import javaioOutputStream;

import javaioPrintWriter;

import javaioRandomAccessFile;

import orgapachecommonsnetPrintCommandListener;

import orgapachecommonsnetftpFTP;

import orgapachecommonsnetftpFTPClient;

import orgapachecommonsnetftpFTPFile;

import orgapachecommonsnetftpFTPReply;

import comweixinconstantDownloadStatus;

import comweixinconstantUploadStatus;

/

  支持断点续传的FTP实用类

  @version 01 实现基本断点上传下载

  @version 02 实现上传下载进度汇报

  @version 03 实现中文目录创建及中文文件创建,添加对于中文的支持

 /

public class ContinueFTP {

public FTPClient ftpClient = new FTPClient();

public ContinueFTP(){

//设置将过程中使用到的命令输出到控制台

thisftpClientaddProtocolCommandListener(new PrintCommandListener(new PrintWriter(Systemout)));

}

/

  连接到FTP服务器

  @param hostname 主机名

  @param port 端口

  @param username 用户名

  @param password 密码

  @return 是否连接成功

  @throws IOException

 /

public boolean connect(String hostname,int port,String username,String password) throws IOException{

ftpClientconnect(hostname, port);

ftpClientsetControlEncoding("GBK");

if(FTPReplyisPositiveCompletion(ftpClientgetReplyCode())){

if(ftpClientlogin(username, password)){

return true;

}

}

disconnect();

return false;

}

/

  从FTP服务器上下载文件,支持断点续传,上传百分比汇报

  @param remote 远程文件路径

  @param local 本地文件路径

  @return 上传的状态

  @throws IOException

 /

public DownloadStatus download(String remote,String local) throws IOException{

//设置被动模式

ftpCliententerLocalPassiveMode();

//设置以二进制方式传输

ftpClientsetFileType(FTPBINARY_FILE_TYPE);

DownloadStatus result;

//检查远程文件是否存在

FTPFile[] files = ftpClientlistFiles(new String(remotegetBytes("GBK"),"iso-8859-1"));

if(fileslength != 1){

Systemoutprintln("远程文件不存在");

return DownloadStatusRemote_File_Noexist;

}

long lRemoteSize = files[0]getSize();

File f = new File(local);

//本地存在文件,进行断点下载

if(fexists()){

long localSize = flength();

//判断本地文件大小是否大于远程文件大小

if(localSize >= lRemoteSize){

Systemoutprintln("本地文件大于远程文件,下载中止");

return DownloadStatusLocal_Bigger_Remote;

}

//进行断点续传,并记录状态

FileOutputStream out = new FileOutputStream(f,true);

ftpClientsetRestartOffset(localSize);

InputStream in = ftpClientretrieveFileStream(new String(remotegetBytes("GBK"),"iso-8859-1"));

byte[] bytes = new byte[1024];

long step = lRemoteSize /100;

long process=localSize /step;

int c;

while((c = inread(bytes))!= -1){

outwrite(bytes,0,c);

localSize+=c;

long nowProcess = localSize /step;

if(nowProcess > process){

process = nowProcess;

if(process % 10 == 0)

Systemoutprintln("下载进度:"+process);

//TODO 更新文件下载进度,值存放在process变量中

}

}

inclose();

outclose();

boolean isDo = ftpClientcompletePendingCommand();

if(isDo){

result = DownloadStatusDownload_From_Break_Success;

}else {

result = DownloadStatusDownload_From_Break_Failed;

}

}else {

OutputStream out = new FileOutputStream(f);

InputStream in= ftpClientretrieveFileStream(new String(remotegetBytes("GBK"),"iso-8859-1"));

byte[] bytes = new byte[1024];

long step = lRemoteSize /100;

long process=0;

long localSize = 0L;

int c;

while((c = inread(bytes))!= -1){

outwrite(bytes, 0, c);

localSize+=c;

long nowProcess = localSize /step;

if(nowProcess > process){

process = nowProcess;

if(process % 10 == 0)

Systemoutprintln("下载进度:"+process);

//TODO 更新文件下载进度,值存放在process变量中

}

}

inclose();

outclose();

boolean upNewStatus = ftpClientcompletePendingCommand();

if(upNewStatus){

result = DownloadStatusDownload_New_Success;

}else {

result = DownloadStatusDownload_New_Failed;

}

}

return result;

}

/

  上传文件到FTP服务器,支持断点续传

  @param local 本地文件名称,绝对路径

  @param remote 远程文件路径,使用/home/directory1/subdirectory/fileext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构

  @return 上传结果

  @throws IOException

 /

public UploadStatus upload(String local,String remote) throws IOException{

//设置PassiveMode传输

ftpCliententerLocalPassiveMode();

//设置以二进制流的方式传输

ftpClientsetFileType(FTPBINARY_FILE_TYPE);

ftpClientsetControlEncoding("GBK");

UploadStatus result;

//对远程目录的处理

String remoteFileName = remote;

if(remotecontains("/")){

remoteFileName = remotesubstring(remotelastIndexOf("/")+1);

//创建服务器远程目录结构,创建失败直接返回

if(CreateDirecroty(remote, ftpClient)==UploadStatusCreate_Directory_Fail){

return UploadStatusCreate_Directory_Fail;

}

}

//检查远程是否存在文件

FTPFile[] files = ftpClientlistFiles(new String(remoteFileNamegetBytes("GBK"),"iso-8859-1"));

if(fileslength == 1){

long remoteSize = files[0]getSize();

File f = new File(local);

long localSize = flength();

if(remoteSize==localSize){

return UploadStatusFile_Exits;

}else if(remoteSize > localSize){

return UploadStatusRemote_Bigger_Local;

}

//尝试移动文件内读取指针,实现断点续传

result = uploadFile(remoteFileName, f, ftpClient, remoteSize);

//如果断点续传没有成功,则删除服务器上文件,重新上传

if(result == UploadStatusUpload_From_Break_Failed){

if(!ftpClientdeleteFile(remoteFileName)){

return UploadStatusDelete_Remote_Faild;

}

result = uploadFile(remoteFileName, f, ftpClient, 0);

}

}else {

result = uploadFile(remoteFileName, new File(local), ftpClient, 0);

}

return result;

}

/

  断开与远程服务器的连接

  @throws IOException

 /

public void disconnect() throws IOException{

if(ftpClientisConnected()){

ftpClientdisconnect();

}

}

/

  递归创建远程服务器目录

  @param remote 远程服务器文件绝对路径

  @param ftpClient FTPClient对象

  @return 目录创建是否成功

  @throws IOException

 /

public UploadStatus CreateDirecroty(String remote,FTPClient ftpClient) throws IOException{

UploadStatus status = UploadStatusCreate_Directory_Success;

String directory = remotesubstring(0,remotelastIndexOf("/")+1);

if(!directoryequalsIgnoreCase("/")&&!ftpClientchangeWorkingDirectory(new String(directorygetBytes("GBK"),"iso-8859-1"))){

//如果远程目录不存在,则递归创建远程服务器目录

int start=0;

int end = 0;

if(directorystartsWith("/")){

start = 1;

}else{

start = 0;

}

end = directoryindexOf("/",start);

while(true){

String subDirectory = new String(remotesubstring(start,end)getBytes("GBK"),"iso-8859-1");

if(!ftpClientchangeWorkingDirectory(subDirectory)){

if(ftpClientmakeDirectory(subDirectory)){

ftpClientchangeWorkingDirectory(subDirectory);

}else {

Systemoutprintln("创建目录失败");

return UploadStatusCreate_Directory_Fail;

}

}

start = end + 1;

end = directoryindexOf("/",start);

//检查所有目录是否创建完毕

if(end <= start){

break;

}

}

}

return status;

}

/

  上传文件到服务器,新上传和断点续传

  @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变

  @param localFile 本地文件File句柄,绝对路径

  @param processStep 需要显示的处理进度步进值

  @param ftpClient FTPClient引用

  @return

  @throws IOException

 /

public UploadStatus uploadFile(String remoteFile,File localFile,FTPClient ftpClient,long remoteSize) throws IOException{

UploadStatus status;

//显示进度的上传

long step = localFilelength() / 100;

long process = 0;

long localreadbytes = 0L;

RandomAccessFile raf = new RandomAccessFile(localFile,"r");

OutputStream out = ftpClientappendFileStream(new String(remoteFilegetBytes("GBK"),"iso-8859-1"));

//断点续传

if(remoteSize>0){

ftpClientsetRestartOffset(remoteSize);

process = remoteSize /step;

rafseek(remoteSize);

localreadbytes = remoteSize;

}

byte[] bytes = new byte[1024];

int c;

while((c = rafread(bytes))!= -1){

outwrite(bytes,0,c);

localreadbytes+=c;

if(localreadbytes / step != process){

process = localreadbytes / step;

Systemoutprintln("上传进度:" + process);

//TODO 汇报上传状态

}

}

outflush();

rafclose();

outclose();

boolean result =ftpClientcompletePendingCommand();

if(remoteSize > 0){

status = resultUploadStatusUpload_From_Break_Success:UploadStatusUpload_From_Break_Failed;

}else {

status = resultUploadStatusUpload_New_File_Success:UploadStatusUpload_New_File_Failed;

}

return status;

}

public static void main(String[] args) {

ContinueFTP myFtp = new ContinueFTP();

try {

Systemerrprintln(myFtpconnect("10106236", 21, "5", "jieyan"));

// myFtpftpClientmakeDirectory(new String("歌曲"getBytes("GBK"),"iso-8859-1"));

// myFtpftpClientchangeWorkingDirectory(new String("歌曲"getBytes("GBK"),"iso-8859-1"));

// myFtpftpClientmakeDirectory(new String("爱你等于爱自己"getBytes("GBK"),"iso-8859-1"));

// Systemoutprintln(myFtpupload("E:\\ywflv", "/ywflv",5));

// Systemoutprintln(myFtpupload("E:\\爱你等于爱自己mp4","/爱你等于爱自己mp4"));

//Systemoutprintln(myFtpdownload("/爱你等于爱自己mp4", "E:\\爱你等于爱自己mp4"));

myFtpdisconnect();

} catch (IOException e) {

Systemoutprintln("连接FTP出错:"+egetMessage());

}

}

}

strUrl为文件地址,fileName为文件在本地的保存路径,试试吧~

public static void writeFile(String strUrl, String fileName) {

URL url = null;

try {

url = new URL(strUrl);

} catch (MalformedURLException e2) {

e2printStackTrace();

}

InputStream is = null;

try {

is = urlopenStream();

} catch (IOException e1) {

e1printStackTrace();

}

OutputStream os = null;

try {

os = new FileOutputStream( fileName);

int bytesRead = 0;

byte[] buffer = new byte[8192];

while ((bytesRead = isread(buffer, 0, 8192)) != -1) {

oswrite(buffer, 0, bytesRead);

}

Systemoutprintln("下载成功:"+strUrl);

} catch (FileNotFoundException e) {

eprintStackTrace();

} catch (IOException e) {

eprintStackTrace();

}

}

/

  文件下载

 /

@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 字段传写入文件里的内容

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 高分:用java实现服务器上多个文件先打包,然后下载,下载完成后删除包!

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情