2

サーバーにファイルをアップロードするために使用Apache's FTPClientしています(重要な場合はギャラリーからの画像)

私は小さくて取るに足らない問題を抱えていますが、それでも解決したいと思います。

問題は、バーがいっぱいになり、アップロードが実際に完了する前に 100% に達することです。これにより、小さなファイルの場合、ダイアログに 100% が余分に 2 ~ 3 秒間表示されます (数 MB のファイルの場合は、さらに多くなる可能性があります)。longからへの変換のせいだとint思いますが、それは単なる推測です。

コードは次のとおりです。

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(UploadActivity.this);
        dialog.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                uploadImage.cancel(true);
            }
        });
        dialog.setMessage("Uploading...\nPlease Wait.");
        dialog.setIndeterminate(false);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setProgress(0);
        dialog.setCancelable(false);
        dialog.setMax((int)(file.length()/1024));
        dialog.setProgressNumberFormat ("%1dKB/%2dKB");
        dialog.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        CopyStreamAdapter streamListener = new CopyStreamAdapter() {

            @Override // THIS PART IS RESPONSIBLE FOR UPDATING THE PROGRESS
            public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) {

                int percent = (int) (totalBytesTransferred * 100 / file.length());
                publishProgress(percent);
            }

        };
        String name = null;
        ftp.setCopyStreamListener(streamListener);
        FileInputStream fis = null;
        try {
            String extension = "";
            String fileName = file.getName();
            int i = fileName.lastIndexOf('.');
            int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

            if (i > p) {
                extension = fileName.substring(i + 1);
            }
            SimpleDateFormat sdf = new SimpleDateFormat("ddMMyy-hhmmss-SSS");
            name = String.format("File-%s.%s", sdf.format(new Date()), extension);
            ftp.connect(FTP_SERVER);
            ftp.enterLocalPassiveMode();
            ftp.login(ftpUser, ftpPassword);
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            fis = new FileInputStream(file);
            if (!ftp.storeFile(name, fis)) {
                showToast("Failed uploading");
                return null;
            }
            ftp.logout();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return name;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        dialog.setProgress(values[0]);
    }

ありがとう!

4

0 に答える 0