2017-02-21 1 views
0

Ich habe verschiedene Tutorials folgen und versuchen, Video auf meinen Server mit Retrofit in Android hochladen. Die einzigen Parameter, die ich brauche, sind wie in der Abbildung unten gezeigt: enter image description hereein Video hochladen mit Retrofit in Android wo Parameter ist Datei

Ich bekomme weiterhin die Timeout-Ausnahme, obwohl ich das Timeout erhöht habe. Dies ist mein Upload Video Code.

final OkHttpClient okHttpClient = new OkHttpClient.Builder() 
      .readTimeout(60, TimeUnit.SECONDS) 
      .connectTimeout(60, TimeUnit.SECONDS) 
      .build(); 
    Log.v("test_get", "get the file"); 
    //MultipartBody.Part vFile = MultipartBody.Part.createFormData("video", videoFile.getName(), videoBody); 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("http://xxxx:xxx/") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .client(okHttpClient) 
      .build(); 

    SmileVideoAPI service = retrofit.create(SmileVideoAPI.class); 
    MediaType MEDIA_TYPE = MediaType.parse("video/mp4"); 
    File videoFile = new File(pathToVideoFile); 
    RequestBody videoBody = RequestBody.create(MEDIA_TYPE, videoFile); 
    Log.v("test_get", "before uploading"); 
    Call<ResponseBody> call = service.uploadVideo("desc", videoBody); 
    Log.v("test_get", "after uploading"); 
    call.enqueue(new Callback<ResponseBody>(){ 
     @Override 
     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
      if (response.isSuccessful()) 
      { 
       Log.i("mok","S"); 
       ResponseBody rb = response.body(); 
       Log.i("mok",rb.toString()); 
      } 
      else { 
       Log.i("mok", "F"); 
       ResponseBody rb = response.errorBody(); 
      } 
     } 
     @Override 
     public void onFailure(Call<ResponseBody> call, Throwable t) { 
      t.printStackTrace(); 
      Log.i("mok",t.getCause()+""); 
      Log.i("mok","T"); 
      finish(); 
     } 
    }); 
    return msg; 

    I have been trying taking reference from this post : 

upload video using Retrofit 2

+0

Was ist Ihr Problem oder Fehler? –

+0

es ist Zeitüberschreitung, es hat bereits funktioniert –

Antwort

0

Wenn Sie Dateien hochladen (jede Art) hier ist ein PHP-Ansatz für Android, die gut funktioniert.

Sie benötigen ein Skript auf der Server-Dateien zu erhalten:

uploadfile.php

<?php 
$fname = $_POST['filename']; 
$target_path = "/yourserverpath/".$fname; 
$upload_path = $_FILES['uploadedfile']['tmp_name']; 
If (move_uploaded_file($upload_path, $target_path)) { 
    echo "Moved"; 
} else { 
    echo "Not Moved"; 
} 
?> 

Sie können Ihre uploadfile.php Skript auf dem Server mit der folgenden HTML-Tester Datei auf dem Server testen von einem Browser aus:

Uploadfile.html:

<form enctype="multipart/form-data" action="uploader.php" method="POST"> 
<input type="hidden" name="MAX_FILE_SIZE" value="100000" /> 
Choose a file to upload: 
<input name="uploadedfile" type="file" /><br /> 
Filename on server: 
<input name="filename" type="text" /><br /> 
<br /> 
<input type="submit" value="Upload File" /> 
</form> 

On Wenn Sie die Server-Seite dazu bringen, Dateien vom Browser hochzuladen, dann ist der Android-Teil ziemlich einfach:

Der Uploader übernimmt das Hochladen von Dateien. Diese Klasse ruft das Skript uploadfile.php auf dem Server auf.

Das Hochladen von Dateien kann schwierig sein, aber wir haben eine geheime Waffe, die es viel einfacher macht. Wir werden den DefaultHttpClient verwenden, der uns Zugriff auf die MultipartEntity-Methode gibt. Diese Methode ist nicht verfügbar, wenn Sie HttpUrlConnection verwenden. Die fileUpload-Klasse wird in der AsyncTask platziert. Der selectedPicName in meinem Beispiel ist einfach Ihr Dateiname. Der postURL ist die vollständige URL des oben erwähnten Skripts.

private class fileUpload extends AsyncTask<Void, String, Void> { 
    protected Void doInBackground(Void... unused) { 
     // upload new picture to the server   
     String postURL = uploadFilesScript; 
     File file = new File(path2, selectedPicName); 
     // upload the new picture 
     Uploader(postURL, file, selectedPicName); 
    } 
} 

Der Uploader-Klasse ist wie folgt: (. Wichtig zu beachten, dass "uploadedfile" Name der Variablen in der PHP-Skript entsprechen hat die empfängt Uploads)

public static void Uploader(String postURL, File file, String fname) { 
    try { 
     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, 
              HttpVersion.HTTP_1_1); 
     HttpPost httppost = new HttpPost(postURL); 
     // the boundary key below is arbitrary, 
     // it just needs to match the MPE so it can decode multipart correctly 
     httppost.setHeader("Content-Type", "multipart/form-data; boundary=--32530126183148"); 
     MultipartEntity mpEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, 
                 "--32530126183148", 
                 Charset.forName("UTF-8")); 
      mpEntity.addPart("uploadedfile", new FileBody((file), "application/txt")); 
      mpEntity.addPart("MAX_FILE_SIZE", new StringBody("100000")); 
      mpEntity.addPart("filename", new StringBody(fname)); 
     } 
     httppost.setEntity(mpEntity); 
     HttpResponse response; 
     response = httpclient.execute(httppost); 
     HttpEntity resEntity = response.getEntity(); 
      if (resEntity != null) { 
       resEntity.consumeContent(); 
       Log.v("UPLOAD", "resEntity=" + resEntity.toString()); 
      } 
     httpclient.getConnectionManager().shutdown(); 
    } catch (Throwable e) { 
    } 
} 

MultipartEntity uns einfach erlaubt zu spezifizieren der Dateiname und der Dateiinhalt mit der addPart-Methode. Im folgenden Beispiel stimmen die Variablennamen mit denen überein, die vom empfangenden PHP-Skript auf dem Server erwartet werden.

Wenn wir diese Upload-Funktion mithilfe der HttpUrlConnection-Klasse durchführen müssten, wäre das kompliziert, da wir unseren eigenen Dateiverwaltungs-Wrapper erstellen müssten. Mit MultipartEntity können wir auch den Zeichensatz und die maximale Dateigröße angeben. Es muss eine eindeutige, aber beliebige Begrenzungszeichenfolge angegeben werden, die mit dem Server-Skript übereinstimmen muss.

Ich habe diesen Ansatz in meinen Produktion Apps verwendet und es funktioniert wirklich gut.

Voll disclosure- schrieb ich ein Buch mit dem Titel Android Software Developement: Eine Sammlung von Praxisprojekten und das Hochladen in einem Server Spinner App in Kapitel 5, aber das sollte alles, was Sie brauchen, um Videos hochladen sein.

+0

danke für Ihre Hilfe, aber wenn möglich würde ich nur nachrüstung verwenden wollen, da ich nicht mit async Aufgabe –

+0

behandeln Sicher, ein sehr guter Grund, um Retrofit zu verwenden! –

Verwandte Themen