2015-04-03 14 views
8

Ich müsste ein Bild von der Anwendung, die ich entwickle, auf den Server hochladen und ich würde gerne wissen, wie ich die Multipart-Anfrage entwickeln kann, um das Bild mit Google Volley zu laden.Laden Sie ein Bild mit Google Volley

Dank

Antwort

12

Ich habe ein Beispiel Bilder von Google Volley hochladen. Werfen Sie einen Blick:

package net.colaborativa.exampleapp.api; 

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.nio.charset.Charset; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.Map; 

import org.apache.http.entity.ContentType; 
import org.apache.http.entity.mime.HttpMultipartMode; 
import org.apache.http.entity.mime.MultipartEntityBuilder; 

import com.android.volley.AuthFailureError; 
import com.android.volley.NetworkResponse; 
import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.Response.ErrorListener; 
import com.android.volley.Response.Listener; 
import com.android.volley.VolleyLog; 
import com.android.volley.toolbox.HttpHeaderParser; 

public class PhotoMultipartRequest<T> extends Request<T> { 


private static final String FILE_PART_NAME = "file"; 

private MultipartEntityBuilder mBuilder = MultipartEntityBuilder.create(); 
private final Response.Listener<T> mListener; 
private final File mImageFile; 
protected Map<String, String> headers; 

public PhotoMultipartRequest(String url, ErrorListener errorListener, Listener<T> listener, File imageFile){ 
    super(Method.POST, url, errorListener); 

    mListener = listener; 
    mImageFile = imageFile; 

    buildMultipartEntity(); 
} 

@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    Map<String, String> headers = super.getHeaders(); 

    if (headers == null 
      || headers.equals(Collections.emptyMap())) { 
     headers = new HashMap<String, String>(); 
    } 

    headers.put("Accept", "application/json"); 

    return headers; 
} 

private void buildMultipartEntity(){ 
    mBuilder.addBinaryBody(FILE_PART_NAME, mImageFile, ContentType.create("image/jpeg"), mImageFile.getName()); 
    mBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
    mBuilder.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8")); 
} 

@Override 
public String getBodyContentType(){ 
    String contentTypeHeader = mBuilder.build().getContentType().getValue(); 
    return contentTypeHeader; 
} 

@Override 
public byte[] getBody() throws AuthFailureError{ 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     mBuilder.build().writeTo(bos); 
    } catch (IOException e) { 
     VolleyLog.e("IOException writing to ByteArrayOutputStream bos, building the multipart request."); 
    } 

    return bos.toByteArray(); 
} 

@Override 
protected Response<T> parseNetworkResponse(NetworkResponse response) { 
    T result = null; 
    return Response.success(result, HttpHeaderParser.parseCacheHeaders(response)); 
} 

@Override 
protected void deliverResponse(T response) { 
    mListener.onResponse(response); 
} 
} 

Und Sie können es wie folgt verwenden:

RequestQueue mQueue = Volley.newRequestQueue(context); 
PhotoMultipartRequest imageUploadReq = new PhotoMultipartRequest(url, ErrorListener, Listener, imageFile); 
mQueue.add(imageUploadReq); 

ich diese Codes hoffen, dass Sie begeistern.

+0

Danke für die Antwort. Ich habe Ihren Code in meine Anwendung importiert, aber ich erhalte einen Fehler für die folgenden Bibliotheken: 'import org.apache.http.entity.ContentType; importieren org.apache.http.entity.mime.HttpMultipartMode; importieren org.apache.http.entity.mime.MultipartEntityBuilder; ' Welche Bibliotheken soll ich importieren? Danke – BigNick

+0

gehen Sie offizielle Website von 'Apache', und laden Sie dann' httpclient_x.x.x.zip', und entpacken Sie dann diese Zip-Datei, um httpclient_x.x.x.jar zu bekommen, dann fügen Sie es in 'libs' Ihres Projekts. – SilentKnight

+0

Sind Sie gut mit Ihren Codes? – SilentKnight

4

@silverknight ‚Antwort Werke s, aber ich hatte auch die folgenden in build.gradle hinzuzufügen httpcomponents Abhängigkeiten zu lösen:

android { 

    ... 

    // have to exclude these otherwise you'll get: 
    // Error:Gradle: Execution failed for task: ... com.android.builder.packaging.DuplicateFileException: ... 
    packagingOptions { 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/DEPENDENCIES' 
    } 
}  

dependencies { 

    ... 

    compile 'com.android.volley:volley:1.0.0' 
    compile('org.apache.httpcomponents:httpmime:4.3.6') { 
     exclude module: 'httpclient' 
    } 
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1' 
} 

HINWEIS: Verwenden Sie org.apache.httpcomponents nicht: Httpclient

Sie sollten mit der Standardversion von 'org.apache.httpcomponents:httpclient:4.5.2'

vermeiden, wenn Sie versuchen:

android { 

    ... 

} 

dependencies { 

    ... 

    compile 'com.android.volley:volley:1.0.0' 
    compile 'org.apache.httpcomponents:httpcore:4.4.4' 
    compile 'org.apache.httpcomponents:httpmime:4.5.2' 
    compile('org.apache.httpcomponents:httpclient:4.5.2' 
} 

Sie erhalten:

java.lang.NoSuchFieldError: No static field INSTANCE of type Lorg/apache/http/message/BasicHeaderValueFormatter; in class Lorg/apache/http/message/BasicHeaderValueFormatter; or its superclasses (declaration of 'org.apache.http.message.BasicHeaderValueFormatter' appears in /system/framework/ext.jar) 

oder etwas ähnliches zu den bestehenden Kommentare [1][2][3].

Sie sollten lieber die Android-Port von httpclient verwenden, da pro this SO answer

HINWEIS: Verwenden Sie org.apache.httpcomponents: httpmime: 4.3.6

Sie org.apache.httpcomponents:httpmime:4.3.6 zu verwenden, haben Sie kann nicht über Version 4.3.x gehen.

android { 

    ... 

} 

dependencies { 

    ... 

    compile('org.apache.httpcomponents:httpmime:4.5.2') { 
     exclude module: 'httpclient' 
    } 
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1' 

mit dieser Konfiguration, wird die folgende erhalten, wenn Sie PhotoMultipartRequest aufrufen: Zum Beispiel können Sie die neueste Version von httpmime, die zum Zeitpunkt des Schreibens 4.5.2 zu bedienen versucht sein

java.lang.NoSuchMethodError: No static method create(Ljava/lang/String;[Lorg/apache/http/NameValuePair;)Lorg/apache/http/entity/ContentType; in class Lorg/apache/http/entity/ContentType; or its super classes (declaration of 'org.apache.http.entity.ContentType' appears in /xxx/base.apk) 
1

Ich kopierte diese Klasse von https://gist.github.com/ishitcno1/11394069 Ich werde Ihnen zeigen, wie Sie es verwenden. In meinem Fall hat es funktioniert. Kopieren Sie diese Klasse. Nehmen Sie notwendige Änderungen vor.

package com.tagero.watchfriend; 

import java.io.ByteArrayOutputStream; 
import java.io.File; 

import java.io.IOException; 

import org.apache.http.HttpEntity; 
import org.apache.http.entity.mime.MultipartEntityBuilder; 
import org.apache.http.entity.mime.content.FileBody; 

import android.util.Log; 

import com.android.volley.AuthFailureError; 
import com.android.volley.NetworkResponse; 
import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.VolleyLog; 

public class PhotoMultipartRequest extends Request<String> { 
static final String TAG = "xxxxxx"; 

public static final String KEY_PICTURE = "kullanici_resmi"; 
public static final String KEY_PICTURE_NAME = "kullanici_resmi_dosya_adi"; 

private HttpEntity mHttpEntity; 

@SuppressWarnings("rawtypes") 
private Response.Listener mListener; 

public PhotoMultipartRequest(String url, String filePath, 
     Response.Listener<String> listener, 
     Response.ErrorListener errorListener) { 
    super(Method.POST, url, errorListener); 

    mListener = listener; 
    mHttpEntity = buildMultipartEntity(filePath); 
} 

public PhotoMultipartRequest(String url, File file, 
     Response.Listener<String> listener, 
     Response.ErrorListener errorListener) { 
    super(Method.POST, url, errorListener); 

    mListener = listener; 
    mHttpEntity = buildMultipartEntity(file); 
} 

private HttpEntity buildMultipartEntity(String filePath) { 
    File file = new File(filePath); 
    return buildMultipartEntity(file); 
} 

private HttpEntity buildMultipartEntity(File file) { 
    MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
    String fileName = file.getName(); 
    logYazdir("fileName : " + fileName); 
    FileBody fileBody = new FileBody(file); 
    builder.addPart(KEY_PICTURE, fileBody); 
    builder.addTextBody(KEY_PICTURE_NAME, fileName); 
    return builder.build(); 
} 

@Override 
public String getBodyContentType() { 
    return mHttpEntity.getContentType().getValue(); 
} 

@Override 
public byte[] getBody() throws AuthFailureError { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     mHttpEntity.writeTo(bos); 
    } catch (IOException e) { 
     VolleyLog.e("IOException writing to ByteArrayOutputStream"); 
    } 
    return bos.toByteArray(); 
} 

@Override 
protected Response<String> parseNetworkResponse(NetworkResponse response) { 
    return Response.success("Uploaded", getCacheEntry()); 
} 

@SuppressWarnings("unchecked") 
@Override 
protected void deliverResponse(String response) { 
    mListener.onResponse(response); 
} 

private void logYazdir(String str) { 
    if (Sabitler.LOG_KONTROL) { 
     Log.d(TAG, str); 
    } 
} 
} 

Und hier ist die Methode zum Hochladen von Bildern.

public void resimYukle(final String filePath) { 
    logYazdir("KaydolActivity-uploadImage çağırıldı!"); 
    logYazdir("\nfilePath : " + filePath); 
    RequestQueue rq = Volley.newRequestQueue(this); 
    PhotoMultipartRequest stringRequest = new PhotoMultipartRequest(
      Sabitler.URL_RESIM_YUKLE, filePath, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        logYazdir("response : " + response); 
        JSONObject veri_json; 
        try { 
         veri_json = new JSONObject(response); 

         int success = 0; 
         String message = ""; 
         try { 
          success = veri_json 
            .getInt(Sabitler.SERVER_RESP_SUCCESS); 
          message = veri_json 
            .getString(Sabitler.SERVER_RESP_MESSAGE); 
          Log.d(TAG, "success : " + success 
            + "\nmessage : " + message); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 

      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        logYazdir("Error [" + error + "]"); 
        Toast.makeText(getBaseContext(), 
          "Sunucuya bağlanılamadı!", Toast.LENGTH_LONG) 
          .show(); 
       } 
      }) { 
     @Override 
     protected Map<String, String> getParams() { 
      Map<String, String> params = new HashMap<String, String>(); 

      params.put("kullanici_resmi_dosya_adi", ""); 

      return params; 

     } 

    }; 

    rq.add(stringRequest); 
} 

Wie willst du filePath bekommen

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent  
             data) { 
     logYazdir("KaydolActivity-onActivityResult çağırıldı!"); 
     if (requestCode == GALERIDEN_RESIM && resultCode == RESULT_OK 
       && data != null) { 
      logYazdir("KaydolActivity-GALERIDEN_RESIM çağırıldı!"); 
      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

      Cursor cursor = getContentResolver().query(selectedImage, 
        filePathColumn, null, null, null); 
      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String picturePath = cursor.getString(columnIndex); 
      cursor.close(); 

      Bitmap bmp = null; 
      try { 
       bmp = getBitmapFromUri(selectedImage); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      kullanici_resmi_iview.setImageBitmap(bmp); 

      resimYukle(picturePath); 

     } 
     super.onActivityResult(requestCode, resultCode, data); 

    } 

Schließlich dies in Ihrer Tätigkeit definieren,

private int GALERIDEN_RESIM = 2; 

Wichtiger Teil, das ist PHP-Code für Ihren Server,

<?php 
$target_dir = "resimler/"; 
$target_file = $target_dir . basename($_FILES["kullanici_resmi"]["name"]); 
$uploadOk = 1; 
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); 
// Check if image file is a actual image or fake image 
if(isset($_POST["kullanici_resmi_dosya_adi"])) { 
    $check = getimagesize($_FILES["kullanici_resmi"]["tmp_name"]); 
    if($check !== false) { 

     $response["success"] = 1; 
     $response["message"] = "File is an image - " . $check["mime"] . "."; 
     echo json_encode($response); 

     $uploadOk = 1; 
    } else { 
     $response["success"] = 0; 
     $response["message"] = "File is not an image."; 
     echo json_encode($response); 

     $uploadOk = 0; 
    } 
} 
// Check if file already exists 
if (file_exists($target_file)) { 
    $response["success"] = 0; 
    $response["message"] = "Sorry, file already exists."; 
    echo json_encode($response); 

    $uploadOk = 0; 
} 
// Check file size 
if ($_FILES["kullanici_resmi"]["size"] > 750000) { 
    $response["success"] = 0; 
    $response["message"] = "Sorry, your file is too large."; 
    echo json_encode($response); 

    $uploadOk = 0; 
} 
// Allow certain file formats 
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" 
&& $imageFileType != "gif") { 
    $response["success"] = 0; 
    $response["message"] = "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; 
    echo json_encode($response); 

    $uploadOk = 0; 
} 
// Check if $uploadOk is set to 0 by an error 
if ($uploadOk == 0) { 
    $response["success"] = 0; 
    $response["message"] = "Sorry, your file was not uploaded."; 
    echo json_encode($response); 
// if everything is ok, try to upload file 
} else { 
    if (move_uploaded_file($_FILES["kullanici_resmi"]["tmp_name"], $target_file)) { 
     $response["success"] = 0; 
     $response["message"] = "The file ". basename($_FILES["kullanici_resmi"]["name"]). " has been uploaded."; 
     echo json_encode($response); 
    } else { 
     $response["success"] = 0; 
     $response["message"] = "Sorry, there was an error uploading your file."; 
     echo json_encode($response); 
    } 
} 
?> 

Sie sollten Ihre Datei in dieser Methode zu senden,

private HttpEntity buildMultipartEntity(File file) { 
    MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
    String fileName = file.getName(); 
    logYazdir("fileName : " + fileName); 
    FileBody fileBody = new FileBody(file); 
    builder.addPart(KEY_PICTURE, fileBody); 
    builder.addTextBody(KEY_PICTURE_NAME, fileName); 
    return builder.build(); 
} 

und achten Sie dies,

public static final String KEY_PICTURE = "kullanici_resmi"; 

kullanici_resmi

ist in PHP-Code verwendet, um anzuzeigen Image-Datei sicher. Ich denke, auf diese Weise können Sie jede Datei senden. Entschuldigung für meine schlechten Erklärungen, ich versuchte alles zu erklären.

Verwandte Themen