上传的图片在服务器上损坏了

3

你好,我正在尝试使用ftp4j将图像上传到服务器。我的图片已经上传到服务器,但是变得损坏了。我知道我的代码中缺少一些内容。我的代码如下:

private class UploadBackgroundTask extends AsyncTask<String, Void, String> {

    protected void onPreExecute() {
        dialog = new ProgressDialog(xxx.this);
        dialog.setMessage("Loading");
        dialog.setCancelable(false);
        dialog.show();

    }

    protected String doInBackground(final String... args) {



        try{
            TrustManager[] trustManager = new TrustManager[] { new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
                public void checkClientTrusted(X509Certificate[] certs, String authType) {
                }
                public void checkServerTrusted(X509Certificate[] certs, String authType) {
                }
            } };

            SSLContext sslContext = null;
            try {
                sslContext = SSLContext.getInstance("TLS");
                sslContext.init(null, trustManager, new SecureRandom());
            } catch (Exception e) {
                e.printStackTrace();
            }
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            FTPClient client = new FTPClient();

            client.setSSLSocketFactory(sslSocketFactory);
            client.setSecurity(FTPClient.SECURITY_FTPES);

            client.connect("xxx.xxx.com");
            client.login("xxx", "xxx");

            client.changeDirectory("product_images/import");
            client.setType(FTPClient.TYPE_BINARY);
            //@TODO read file from android system
            System.out.println("temPath -->"+picturepath);
            client.upload(new File(picturepath));


            FTPFile[] list = client.list();
            for(int i=0;i<list.length;i++){
                System.out.println("-->"+list[i]);
            }


            Log.v("SUCCESFULLY UPLOADED", "SUCCESFULLY UPLOADED");
            }catch(Exception ex){
                ex.printStackTrace();
            }


        return null;

    }

    protected void onPostExecute(String list) {
        dialog.dismiss();

    }
}

我在服务器上的图片是:在此输入图片描述

我的日志跟踪(logTrace) 是:

it.sauronsoftware.ftp4j.FTPException [code=450, message= Transfer aborted. Link to file server lost]
at it.sauronsoftware.ftp4j.FTPClient.upload(FTPClient.java:2799)
at it.sauronsoftware.ftp4j.FTPClient.upload(FTPClient.java:2586)
at it.sauronsoftware.ftp4j.FTPClient.upload(FTPClient.java:2495)
at com.Activity.xxx.AddProducts$UploadBackgroundTask.doInBackground(AddProducts.java:902)
at com.Activity.xxx.AddProducts$UploadBackgroundTask.doInBackground(AddProducts.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
 Window already focused, ignoring focus gain of:
com.android.internal.view.IInputMethodClient$Stub$Proxy@41174c80

上传后,服务器上的文件大小始终为4 KB。为什么?

我已经搜索了很多,但是没有得到答案。 请告诉我我的代码有什么问题。 提前致谢。


你有检查文件大小吗?这可能会给一些提示。 - SJuan76
在移动端,图像大小为27 KB,但在服务器端只有4.0 KB。 - Rash
我的代码有什么缺失吗? - Rash
你的代码看起来没问题,常见错误是二进制/ASCII转换,但你已经检查过了。结果文件大小为4k(4096字节),这通常是缓冲区或磁盘扇区的衡量标准,指向其他地方的失败原因(FTP库?)。 - SJuan76
FTP服务器的日志记录了什么信息? - pankar
1个回答

1
尝试像这样实现监听器:
import it.sauronsoftware.ftp4j.FTPDataTransferListener;

public class MyTransferListener implements FTPDataTransferListener {

    public void started() {
        // Transfer started
    }

    public void transferred(int length) {
        // Yet other length bytes has been transferred since the last time this
        // method was called
    }

    public void completed() {
        // Transfer completed
    }

    public void aborted() {
        // Transfer aborted
    }

    public void failed() {
        // Transfer failed
    }

}

并使用client.upload(new File(picturepath), new MyTransferListener());上传文件,以便您可以跟踪文件上传过程中发生的情况。

编辑:

  1. 检查上传的图像大小和方法transferred(int length)中的参数是否相等。(如果图像小于64k)
  2. 检查FTP服务器上接收到的字节数量是否相同(检查FTP服务器日志)
  3. 如果上述任何条件不成立,则问题在ftp4j中;如果两个条件都成立,则问题在您的FTP服务器中。

它只是开始了,然后只显示了一点点传输的大小。之后我遇到了上述异常。那么我该如何解决呢? - Rash
@Rash请发布完整的异常堆栈跟踪。FTPException可能在许多地方发生。 - user1516873
请勿恢复上传到服务器(如果您上传具有相同名称的文件,则可能会如此)。 - user1516873
MyTransferListener.transferred(int length) 方法中的 length 参数具体表示什么?这很重要。 - user1516873
图片长度总是不同,并且在服务器上始终以4 KB的大小显示,为什么? - Rash
显示剩余6条评论

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