2011-02-24 8 views
10

다음 코드를 사용하여 동영상을 PHP 서버에 업로드하면 문제가 없습니다. 파일 업로드 중에 진행률 표시 줄을 표시해야합니다. 파일 업로드와 진행률 표시 줄 사이의 동기화가 필요합니다. 누구나 추천합니다. 생각?android에 진행률 표시 줄을 업로드 하시겠습니까?

 HttpURLConnection conn = null; 
     DataOutputStream dos = null; 
     DataInputStream inStream = null; 
     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 
     int bytesRead, bytesAvailable, bufferSize; 
     byte[] buffer; 
     int maxBufferSize = 1 * 1024 * 1024; 
     String responseFromServer = ""; 

     File sourceFile = new File(sourceFileUri); 
     if (!sourceFile.isFile()) { 
     Log.e("Huzza", "Source File Does not exist"); 
     return; 
     } 
     int serverResponseCode=0; 
    try { // open a URL connection to the Servlet 
     FileInputStream fileInputStream = new FileInputStream(sourceFile); 
     URL url = new URL(upLoadServerUri); 
     conn = (HttpURLConnection) url.openConnection(); // Open a HTTP connection to the URL 
     conn.setDoInput(true); // Allow Inputs 
     conn.setDoOutput(true); // Allow Outputs 
     conn.setUseCaches(false); // Don't use a Cached Copy 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Connection", "Keep-Alive"); 
     conn.setRequestProperty("ENCTYPE", "multipart/form-data"); 
     conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 
     conn.setRequestProperty("uploadedfile", fileName); 

     // conn.setFixedLengthStreamingMode(1024); 
     //conn.setChunkedStreamingMode(1); 
     dos = new DataOutputStream(conn.getOutputStream()); 

     dos.writeBytes(twoHyphens + boundary + lineEnd); 
     dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""+ fileName + "\"" + lineEnd); 
     dos.writeBytes(lineEnd); 

     bytesAvailable = fileInputStream.available(); // create a buffer of maximum size 
     Log.i("Huzza", "Initial .available : " + bytesAvailable); 

     //bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     bufferSize=(int)sourceFile.length(); 


     System.out.println("BytesAvail"+bytesAvailable); 
     System.out.println("maxBufferSize"+maxBufferSize); 
     buffer = new byte[bufferSize]; 

     // read file and write it into form... 
     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

     while (bytesRead > 0) { 
     dos.write(buffer, 0, bufferSize); 

     bytesAvailable = fileInputStream.available(); 

     bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     } 

     // send multipart form data necesssary after file data... 
     dos.writeBytes(lineEnd); 
     dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

     // Responses from the server (code and message) 
     serverResponseCode = conn.getResponseCode(); 
     String serverResponseMessage = conn.getResponseMessage(); 

     Log.i("Upload file to server", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode); 
     // close streams 
     Log.i("Upload file to server", fileName + " File is written"); 
     fileInputStream.close(); 
     dos.flush(); 
     dos.close(); 
     } catch (MalformedURLException ex) { 
     ex.printStackTrace(); 
     Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    //this block will give the response of upload link 
     try { 
     BufferedReader rd = new BufferedReader(new InputStreamReader(conn 
     .getInputStream())); 
     String line; 
     while ((line = rd.readLine()) != null) { 
     Log.i("Huzza", "RES Message: " + line); 
     } 
     rd.close(); 
     } catch (IOException ioex) { 
     Log.e("Huzza", "error: " + ioex.getMessage(), ioex); 
     } 
     return; // like 200 (Ok) 

감사합니다.

+0

다음과 같은 답을 확인, 그것은 도움이 될 수 [http://stackoverflow.com/questions/15572747/progressbar-in-asynctask-is-not-showing-on-upload][1] [1] : http://stackoverflow.com/a/19295719/463846 – Mousa

+0

문자열과 같은 추가 데이터를이 멀티 파트 데이터로 어떻게 보낼 수 있습니까? – user5155835

답변

7

업로드 코드를 doInBackGround 방법으로 AsyncTask에 넣으십시오. 그런 다음 publishProgress에서, onProgressUpdate에서 ProgressBar를 업데이트 할 수 있습니다.

으로 표시되는 내용은 look here입니다.

0

AFAIK AsyncTask가 작동해야하지만 대부분의 작업을 더 세밀하게 제어하려면 핸들러가있는 스레드를 사용할 수 있습니다.

1

현재 업로드 진행 상태를 수치로 표시하여 진행률 표시 줄로 표시 할 수있는 방법을 묻고 싶습니다. 현재 코드를 사용하면 쉽게 할 수 있는지 확신 할 수 없습니다. 업로드를 시도한 가장 큰 파일은 무엇입니까? 큰 파일에 OutOfMemory 오류가 발생한다고 생각합니다. 이렇게하면 :

byte[] buffer; 
bufferSize=(int)sourceFile.length(); 
buffer = new byte[bufferSize]; 
bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
while (bytesRead > 0) { 
... 

"버퍼"는 전체 파일과 동일한 크기의 배열입니다. fileInputStream.read()을 호출하면 파일의 전체 내용을 "버퍼"에 넣을 수 있습니다. 파일 크기가 크면 (수십 메가 바이트 이상) OutOfMemory 오류로 앱이 다운 될 수 있습니다. 당신은 고정 된 크기의 작은 버퍼를 사용하는 경우

, 다음 while 루프를 때마다 당신은, 당신이 이미 전송 한 데이터의 양을 계산 백분율 값으로 변환하고 어느 쪽 AsyncTask 또는 sendMessage에 대한 publishProgess를 호출 할 수 있습니다 a Handler.

+0

outofmemory 오류를 해결하는 데 도움이 될 수 있습니까? – brian

+0

하지만이 진행 상황은 업로드되는 파일의 진행 상태가 아닙니다. 버퍼에 쓰여지는 파일의 진행. 권리 ? –

+0

@MuhammadRiyaz 그것은 루프의 호출 순서에 따라 달라집니다. 출력 스트림에 기록한 다음 진행률을 계산하고 게시하면 업로드 된 데이터 양입니다. 주문을 교환하는 경우 읽은 데이터의 양입니다. 실제로 버퍼는 일반적으로 업로드 할 데이터 양보다 훨씬 작으므로 사용자에게는 아무런 차이가 없습니다. –

-1
connection.setFixedLengthStreamingMode((int) requestLength); 

나를 위해 속임수를 사용했습니다!

+0

이 경우 requestLength가 무엇인지 알 수 있습니까? 어떻게 그것을 얻을 수 있습니까? – user5155835

+0

requestlength 설명도 함께 입력하십시오. – NehaK

+0

@ user5155835'int requestLength = sourceFile.length();' – Zurechtweiser

관련 문제