我正在尝试使用 apache.commons.ftp 库将 Android 中的文件上传到 FTP 服务器。
注意:我使用
storeFileStream
以便我可以跟踪上传进度。
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
InputStream inputStream = new FileInputStream(localFile);
OutputStream outputStream = ftpClient.storeFileStream(remoteFile);
byte[] buffer = new byte[8192];
int bytesRead;
logMessage("Starting to upload file");
while ((bytesRead = inputStream.read(buffer)) != -1) {
total += bytesRead;
outputStream.write(buffer, 0, bytesRead); //output stream is null here
latestPercentDone = (int) ((total / (float) totalMegaBytes) * 100);
if (percentDone != latestPercentDone) {
percentDone = latestPercentDone;
publishProgress(""+percentDone);
}
}
inputStream.close();
outputStream.close();
ftpClient.completePendingCommand();
我正在使用 speedtest.tele2.net 服务器进行测试。使用匿名登录。
日志一直说输出流为空。
编辑:使用 Martin Prikryl 并获取错误代码,我发现问题出在远程文件的位置。
上传到某个位置而不是目录。
例如,如果文件名为
item1.txt
,则远程文件应为 /item1.txt
或 /someFolder/AnotherFolder/item1.txt
,而不是 /someFolder/AnotherFolder/
FTPClient.storeFileStream
方法可以返回null
:
一个OutputStream,通过它可以写入远程文件。 如果无法打开数据连接(例如文件不存在),则返回null(此时可以通过查看回复码来确定失败的具体原因)。
虽然“文件不存在”的提示对于上传来说是无意义的,但这显然是来自
.retrieveFileStream
(下载)的复制粘贴错误。
.getReplyCode
和 .getReplyString
,查看出了什么问题。