FTPClient在Android上传图片到FTP服务器时损坏了图片?

7
我正在尝试从Android手机(HTC Desire HD)上传图像到FTP服务器(在我的本地PC上)。 图像将被发送到FTP服务器,但它们是损坏的。 ftpClient.storeFile()方法会抛出IOException(错误文件号)。 请帮帮我。 这是已损坏的图像链接:

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();
    }

我会说它被缩短了一些字节,而不是真正的损坏。 - fvu
1
如果文件类型是图像,则不会有任何操作。但如果文件类型是音频,则无法播放音频文件。 - osman katib
是的,这是一个可重复的问题。我尝试了两种类型的文件,如音频和图像。我还尝试了不同的图像。 - osman katib
1
你是否可能被 https://issues.apache.org/jira/browse/NET-409 给困扰了? - fvu
1
@osman:请解释一下问题是如何解决的。这可能会帮助其他遇到同样问题的人。您可以通过添加自己的答案来解释问题所在。 - Squonk
显示剩余4条评论
2个回答

3

Apache FTP客户端在这方面存在一些问题。以下是如何通过Java程序使用Ftp4J有效处理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)
    }

}

你如何指定正在上传的文件的名称? - Eenvincible

2

嗨,Osman,我正在使用你上面编写的代码,但它对我不起作用。图像已上传,但是损坏了。PNG图像甚至无法显示。你能指导我吗?谢谢。 - Sujit
3
嗨,Sujit,Apache FTPClient存在许多漏洞。这个问题已经解决了。后来出现了其他问题,我开始使用ftp4j。这是链接:http://www.sauronsoftware.it/projects/ftp4j/。我建议你使用这个组件。 - osman katib
你确定这个ftp4j不会出问题吗? - Nikunj Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接