gpt4 book ai didi

java - FTP zip 上传有时会损坏

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:32:33 24 4
gpt4 key购买 nike

我写了一段代码,用于在文件中保存几张图片,然后压缩该文件并上传到 ftp 服务器。当我从服务器下载它时,很少有文件是好的,也很少有文件被损坏。这可能是什么原因?是否可能是压缩代码或上传程序代码有问题。

压缩代码:

public class Compress {

private static final int BUFFER = 2048;

private ArrayList<String> _files;
private String _zipFile;

public Compress(ArrayList<String> files, String zipFile) {
Log.d("Compress", "Compressing started");
_files = files;
_zipFile = zipFile;
}

public void zip() {
try {
BufferedInputStream origin = null;
File f = new File(_zipFile);
if (f.exists())
f.delete();
FileOutputStream dest = new FileOutputStream(_zipFile);

ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
dest));

byte data[] = new byte[BUFFER];

for (int i = 0; i < _files.size(); i++) {
Log.v("Compress", "Adding: " + _files.get(i));
FileInputStream fi = new FileInputStream(_files.get(i));
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(_files.get(i).substring(
_files.get(i).lastIndexOf("/") + 1));
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}

out.close();
} catch (Exception e) {
e.printStackTrace();
}

}

FTP上传代码:

public class UploadZipFiles extends AsyncTask<Object, Integer, Object> {
ArrayList<String> zipFiles;
String userName, password;
WeakReference<ServiceStatusListener> listenerReference;
private long totalFileSize = 0;
protected long totalTransferedBytes = 0;
final NumberFormat nf = NumberFormat.getInstance();

public UploadZipFiles(ServiceStatusListener listener,
ArrayList<String> zipFiles, String userName, String password) {
Log.d("u and p", "" + userName + "=" + password);
this.zipFiles = zipFiles;
this.userName = userName;
this.password = password;
this.listenerReference = new WeakReference<ServiceStatusListener>(
listener);
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);

}

@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
for (String file : zipFiles) {
totalFileSize = totalFileSize + new File(file).length();
}
}

@Override
protected Object doInBackground(Object... arg0) {
CustomFtpClient ftpClient = new CustomFtpClient();

try {

ftpClient.connect(ftpUrl);

// change here
ftpClient.login(userName, password);

ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

for (String file : zipFiles) {

InputStream in;

in = new FileInputStream(new File(file));

ftpClient.storeFile(new File(file).getName(), in);

in.close();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// TODO add files to ftp

return "Success";
}

@Override
protected void onPostExecute(Object result) {
if (result instanceof Exception) {
listenerReference.get().onFailure(
new Exception(result.toString()));
} else {
listenerReference.get().onSuccess("Success");
}
}

@Override
protected void onProgressUpdate(Integer... values) {

UploadActivity.progressBar
.setProgress((int) (((float) values[0] / totalFileSize) * 100));
UploadActivity.uploadingSizeTextView.setText(nf
.format(((float) values[0] / (1024 * 1024)))
+ " mb of "
+ nf.format(((float) totalFileSize / (1024 * 1024)))
+ " mb uploaded");
}

public class CustomFtpClient extends FTPClient {

public boolean storeFile(String remote, InputStream local)
throws IOException {
OutputStream output;
Socket socket;

if ((socket = _openDataConnection_(FTPCommand.STOR, remote)) == null)
return false;

output = new BufferedOutputStream(socket.getOutputStream(),
getBufferSize());
// if (__fileType == ASCII_FILE_TYPE)
// output = new ToNetASCIIOutputStream(output);
// Treat everything else as binary for now
try {
Util.copyStream(local, output, getBufferSize(),
CopyStreamEvent.UNKNOWN_STREAM_SIZE,
new CopyStreamListener() {
@Override
public void bytesTransferred(
long totalBytesTransferred,
int bytesTransferred, long streamSize) {
totalTransferedBytes = totalTransferedBytes
+ bytesTransferred;
publishProgress((int) totalTransferedBytes);
// UploadActivity.uploadingSizeTextView.setText(nf
// .format((totalBytesTransferred / (1024 *
// 1024)))
// + " mb of "
// + nf.format((totalFileSize / (1024 *
// 1024)))
// + " mb uploaded");
}

@Override
public void bytesTransferred(
CopyStreamEvent arg0) {
// TODO Auto-generated method stub

}
});
// Util.copyStream(local, output, getBufferSize(),
// CopyStreamEvent.UNKNOWN_STREAM_SIZE, null, false);

} catch (IOException e) {
try {
socket.close();
} catch (IOException f) {
}
throw e;
}
output.close();
socket.close();
return completePendingCommand();
}
}
}

最佳答案

请务必以 BINARY_FILE_TYPE 格式传输文件。也许 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 返回 false?

顺便说一句,如果您以 ASCII 模式传输 zip,这几乎肯定会导致损坏。

关于java - FTP zip 上传有时会损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17462522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com