0

サーバー経由で wav ファイルをアップロードするための次のコードを作成しました。私が直面している問題は、進行状況バーが 99% まで速く移動し、サーバーが 200 OK 応答を返すと完了することです。

しかし、ファイルをアップロードしているときにドロップボックスで見たことがありますが、進行状況バーが徐々に動いており、説得力があるように見えます。

シームレスな進行状況バーを表示する方法は誰でも知っています。

    @Override
        protected String doInBackground(Void...args) {
            // TODO Auto-generated method stub


            System.out.println(uploadLink);
            FileInputStream sourceFile = null;

            try {
                sourceFile = new FileInputStream(to);
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }




            URL url;
            try {

                byte[] bytes = new byte[(int) to.length()];
                sourceFile.read(bytes);


                url = new URL(uploadLink);
                connection = (HttpURLConnection) url.openConnection();
                connection.setDoInput(true);
                connection.setDoOutput(true);
                connection.setUseCaches(false);
                connection.setRequestMethod("POST");    

                connection.setRequestProperty("Connection", "Keep-Alive");
                connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
                out = new DataOutputStream( connection.getOutputStream() );
                out.writeBytes(twoHyphens + boundary + lineEnd);                
                out.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + templateID + ".wav" + "\"" + lineEnd);
                out.writeBytes(lineEnd);
                bytesAvailable = sourceFile.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[bufferSize];

                Log.d("BYTES" , bytesAvailable + " "+bufferSize +" "+  bytes.length);

                int bufferLength = 1024;

                for (int i = 0; i < bytes.length; i += bufferLength) {

                    int progress = (int)((i / (float) bytes.length) * 100);
                    publishProgress(progress);

                    if (bytes.length - i >= bufferLength) {
                        out.write(bytes, i, bufferLength);
                    } else {
                        out.write(bytes, i, bytes.length - i);
                    }
                }


               out.writeBytes(lineEnd);
               out.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
               sourceFile.close();
               out.flush();
               out.close();            



            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();



                return null;
            } 
             try {
                 in = new DataInputStream ( connection.getInputStream() );
                 String str;

                 Log.d("STATUS",connection.getResponseCode()+ " ");

                 if(connection.getResponseCode() == 200)
                 {                   
                     while (( str = in.readLine()) != null)
                     {
                      Log.e("Debug","Server Response "+str);
                      publishProgress(100);





                     }
                 }


                 in.close();

           }
           catch (IOException ioex){
                Log.e("Debug", "error: " + ioex.getMessage(), ioex);
           }

            // Get the source File


            return "success";
        }
4

3 に答える 3

1

私もこれを達成するのに苦労しました. クライアントは常に進歩は現実的ではないと言っていた.

私が見つけた解決策setFixedLengthStreamingModeは、HttpURLConnectionオブジェクトで使用することでした (詳細については、setFixedLengthStreamingMode こちらを参照してください)。基本的にこれが行うことは、Content-Lengthヘッダーがはるかに早く設定されるため、URLConnectionより頻繁にフラッシュできることです。

コードは次のようになります。

String header = twoHyphens + boundary + lineEnd + "Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + templateID + ".wav" + "\"" + lineEnd + lineEnd;
String closingHeader = lineEnd + twoHyphens + boundary + twoHyphens + lineEnd;

int bytesToBeSent = header.lenght() + closingHeader.lenght() + (int)to.length();

connection.setFixedLengthStreamingMode(bytesToBeSent);

を使用する前に設定する必要がありますsetRequestMethod()

于 2013-03-05T00:30:55.703 に答える
0

速いなら速いじゃないですか。私が提案する唯一のことは publishProgress(100);、応答を得るまでではなく、アップロードが完了したら電話することです.

于 2013-01-22T18:56:23.033 に答える
-1

キーは setChunkedStreamingMode() です。setRequestMethod() の前にファイルの長さに設定する必要があります。これにより、バイトがチャンクで送信され、進行状況バーに進行状況が表示されます。それを設定したら、質問で提供されたコードを使用できます。

于 2016-04-08T09:21:46.757 に答える