【问题标题】:Uploade image is corrupted on server上传图片在服务器上损坏
【发布时间】:2012-10-26 12:54:59
【问题描述】:

您好,我正在尝试使用 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。为什么?

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

【问题讨论】:

  • 您检查过文件大小吗?这可以给出一个提示。
  • 移动图像大小为 27 kb,但在服务器端只有 4.0 KB
  • 我的代码中缺少什么
  • 您的代码看起来不错,通常怀疑是二进制/ascii 转换,但您已经检查过了。结果文件有 4k(4096 字节),这是缓冲区或磁盘扇区的常用度量,这一事实表明其他地方出现故障(ftp 库?)
  • 日志说什么(FTP 服务器)?

标签: java android image ftp


【解决方案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 发布完整异常堆栈跟踪。 FTPException 可能发生的地方很多。
  • 还要检查你没有恢复上传到服务器(如果你上传了同名的文件)
  • 不,我保存的名称不同。因为我已将时间戳附加到图像名称
  • @Rash 你用的是什么版本的 ftp4j?
猜你喜欢
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2014-04-26
  • 2017-09-13
相关资源
最近更新 更多