FTPClient 在上传到 android 上的 ftp 服务器时损坏图像?

Posted

技术标签:

【中文标题】FTPClient 在上传到 android 上的 ftp 服务器时损坏图像?【英文标题】:FTPClient corrupts the images while uploading to ftp server on android? 【发布时间】:2011-09-05 19:33:01 【问题描述】:

我正在尝试将图像从 android 手机 (HTC Desire HD) 上传到 FTP 服务器(在我的本地 PC 上)。图像将发送到 FTP 服务器,但它们已损坏。

并且方法(ftpClient.storeFile())抛出IOException(Bad File Number)

请帮帮我。

这是损坏的图片链接:

http://imageshack.us/photo/my-images/820/komikb.jpg/

这是代码:

FTPClient ftpClient = new FTPClient();
    try 
        ftpClient.connect("192.168.2.14");
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
        ftpClient.setSoTimeout(10000);
        ftpClient.enterLocalPassiveMode();
        if(ftpClient.login("Administrator", "xxxx"))
        
            File sFile=new File("mnt/sdcard/DCIM/komik.jpg");
            FileInputStream fs= new FileInputStream(sFile);
            String fileName = sFile.getName();
            Boolean result = ftpClient.storeFile("/ftpfile.atspace.co.uk/" + fileName, fs);
            String has = "";
        
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

【问题讨论】:

我会说它被缩短了几个字节,并没有真正损坏。 +1 为(否则很可爱)绣球花上的优秀圆圈。 如果文件是图像则没有。但是如果文件类型是音频,则音频文件没有播放。 会不会是被issues.apache.org/jira/browse/NET-409咬了? @osman:请说明问题是如何解决的。它可能会帮助其他人解决同样的问题。您可以自己添加一个答案来解释问题所在。 【参考方案1】:

Apache FTP 客户端对此有几个突出的问题。下面是关于如何使用 Ftp4J 通过 java 以编程方式有效处理 ftp 的说明。

下载Ftp4J:http://www.sauronsoftware.it/projects/ftp4j/download.php

然后在你的 IDE 中:

import java.io.File;
import java.io.IOException;

import it.sauronsoftware.ftp4j.FTPAbortedException;
import it.sauronsoftware.ftp4j.FTPClient;
import it.sauronsoftware.ftp4j.FTPDataTransferException;
import it.sauronsoftware.ftp4j.FTPException;
import it.sauronsoftware.ftp4j.FTPIllegalReplyException;

public class FTP4J 

    /**
     * @param args
     * @throws FTPAbortedException 
     * @throws FTPDataTransferException 
     * @throws FTPException 
     * @throws FTPIllegalReplyException 
     * @throws IOException 
     * @throws IllegalStateException 
     */
    public static void main(String[] args) throws IllegalStateException, IOException, FTPIllegalReplyException, FTPException, FTPDataTransferException, FTPAbortedException 
        FTP4J ftp= new FTP4J();
        ftp.transfer();
    

    private void transfer() throws IllegalStateException, IOException, FTPIllegalReplyException, FTPException, FTPDataTransferException, FTPAbortedException
        FTPClient client = new FTPClient();
        client.connect("192.168.0.1"); //conect to FTP server (in my case a vsftp on centos 6.4)
        client.login("admn", "admn123");//login to FTP Server
        client.changeDirectory("/usr/share/tomcat/webapps/imgs/"); //tell FTP4J where on the Ftp Server to send your file that you want to upload.
        File fileUpload = new File ("C:\\Users\\ih8w8\\Pictures\\1.jpg"); //point FTP4J to the file you want to upload
        client.upload(fileUpload); //upload it
        client.disconnect(true); //close connection (note: you could also log out first, then disconn if youre not in a test env)
    


【讨论】:

如何指定要上传的文件名?【参考方案2】:

问题解决了。 FTPClient 类有“最后一个数据包数据丢失错误”。但这已通过 3.0.1 23.05.2011 版本解决。

你可以从关于bug的详细解释中看到: https://issues.apache.org/jira/browse/NET-409

您可以下载固定版本 https://repository.apache.org/content/repositories/snapshots/commons-net/commons-net/3.0.1-SNAPSHOT/

【讨论】:

嗨,奥斯曼,我正在使用 3.0.1 和您上面编写的代码,但它对我不起作用。图像正在上传但已损坏。 png 图像甚至不显示。你能指导我吗??..谢谢 嗨 sujit,apache FTPClient 有很多错误。这个问题就解决了。后来出现了另一个问题,我开始使用ftp4j。这是链接:sauronsoftware.it/projects/ftp4j我建议你使用这个组件。 你确定这个 ftp4j 没有问题吗?

以上是关于FTPClient 在上传到 android 上的 ftp 服务器时损坏图像?的主要内容,如果未能解决你的问题,请参考以下文章

FTPClient listFiles 阻塞问题

java如何实现将FTP文件转移到另一个FTP服务器上

FTP文件上传下载

怎么用Java实现FTP上传

JAVA利用commons.net.ftp.FTPClient的storeFileStream方法TXT文件上传. 已经转码UTF-16LE,上传后内容乱码

FtpClient上传文件速度非常慢,而且大小为0,上传失败