2016-04-01 2 views
1

Ich erstelle eine Android-Anwendung und ich versuche, Profilbild für Benutzer zu speichern. Wenn Benutzer sich registrieren, wird er in der Tabelle registriert, und ich habe ein weiteres Feld image dort eingefügt, wo ich Bilder für ihn speichern werde. Aber ich denke, dass ich PUT Request-Methode verwenden muss, wenn Sie eine Abfrage senden. Ich lade dieses Bild basierend auf der Benutzer-ID hoch und authentifiziere key-api, die jeder Benutzer bei der Registrierung erhält. Dies ist, was ich bisher getan habe:Wie lade ich ein Bild in eine bestehende MySql-Datenbank hoch?

public function uploadImage($user_id, $image, $status) { 
    $path = "uploads/$user_id.png"; 
    $actualpath = "http://localhost:8081/timster/uploads/$path"; 
    $stmt = $this->conn->prepare("UPDATE users SET image = $actualpath, status = ? WHERE id = ?"); 
    $stmt->bind_param("sii", $image, $status, $id); 
    $stmt->execute(); 
    $num_affected_rows = $stmt->affected_rows; 
    $stmt->close(); 
    return $num_affected_rows > 0; 
} 

Hier bin ich wirklich fest, ich weiß nicht, was ich als nächstes tun soll. Und das ist, wie ich eine Abfrage für die Aktualisierung users Tabelle senden und Bild hochladen.

$app->put('/image/:id', 'authenticate', function($user_id) use ($app) { 

    // check for required params 
    verifyRequiredParams(array('image', 'status')); 

    global $user_id; 
    $image = $app->request->put('image'); 
    $status = $app->request->put('status'); 

    $db = new DbHandler(); 
    $response = array(); 

    $result = $db->uploadImage($user_id, $image, $status); 
    if ($result) { 
     $response["error"] = false; 
     $response["message"] = "Image uploaded successfully"; 
    } else { 
     $response["error"] = true; 
     $response["message"] = "Image failed to upload"; 
    } 
    echoRespnse(200, $response); 
}); 

Ich habe laufen diese nicht zu überprüfen, ob es funktioniert, aber ich bin sicher, dass ich in der Funktion uploadImage() etwas mehr hinzufügen müssen.

So sieht zum Beispiel meine URL beim Senden einer PUT-Anfrage aus. http://localhost:8081/timster/v1/image/2. Die letzte Nummer ist die ID eines Benutzers, bei dem ich ein neues Bild hochladen möchte.

+0

wird Ihr Bild in die Uploads der Ordner hochgeladen? , da ich in Ihrem Code keinen Datei-Upload-Code sehe. –

+0

Es sollte sein. Sollte ich einige Änderungen im PHP-Code vorgenommen haben? –

+0

Randnotiz: Soll ein Benutzer für andere Benutzer hochladen können? Wenn nicht, überspringe die Benutzer-ID in der URL und benutze einfach die Benutzer-ID im Token – JimL

Antwort

1

Hier sind Sie ein Code, den ich vor einiger Zeit entwickelt habe, um ein Bild auf einen PHP-Server zu laden, hoffe Hilfe.

Erster Schritt php Server-Seite erstellen:

<?php 
    // Get image string posted from Android App 
    $base=$_REQUEST['image']; 
    // Get file name posted from Android App 
    $filename = $_REQUEST['filename']; 
    // Decode Image 
    $binary=base64_decode($base); 
    header('Content-Type: bitmap; charset=utf-8'); 
    // Images will be saved under './uplodedimages' folder 
    $file = fopen('uploadedimages/'.$filename, 'wb'); 
    // Create File 
    fwrite($file, $binary); 
    fclose($file); 
    echo 'Image upload complete, Please check your php file directory'; 
?> 

Zweiter Schritt eine IntentService erstellen Sie Ihr Foto hochladen:

public class SendImageServer extends IntentService { 

    //Local variables 
    private Bitmap mBitmap; 
    private int result; 
    private String photoName; 

     public SendImageServer() { 
     super(Constants.INTENT_SERVICE_CLASS_NAME); 

     } 


    @Override 
    protected void onHandleIntent(Intent intent) { 
     try { 
      String filePath = intent.getStringExtra(Constants.INTENT_SERVICE_FILE_PATH); 
      java.util.UUID photoNameUUID = java.util.UUID.randomUUID(); 
      photoName = photoNameUUID.toString()+".png"; 
      BitmapFactory.Options options = null; 
      options = new BitmapFactory.Options(); 
      options.inSampleSize = 3; 
      mBitmap = BitmapFactory.decodeFile(filePath.trim(), 
        options); 
      mBitmap = Bitmap.createScaledBitmap(mBitmap, Constants.WIDTH_PHOTO, Constants.HEIGHT_PHOTO, true); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      // Must compress the Image to reduce image size to make upload easy 
      mBitmap.compress(Bitmap.CompressFormat.PNG, 50, stream); 
      byte[] byte_arr = stream.toByteArray(); 
      // Encode Image to String 
      String encodedString = Base64.encodeToString(byte_arr, 0); 

      RequestParams params = new RequestParams(); 
      params.put("image", encodedString); 
      params.put("filename", photoName); 
      makeHTTPCall(params); 


     } 
     catch (Exception e){ 
      publishResults("", 4,0); 
     } 

    } 

    /** 
    * Make Http call to upload Image to Php server 
    * @param params 
    */ 
    public void makeHTTPCall(RequestParams params) { 

     SyncHttpClient client = new SyncHttpClient(); 
     // Don't forget to change the IP address to your LAN address. Port no as well. 
     client.post(Constants.FILE_UPLOAD_URL, 
       params,new AsyncHttpResponseHandler() { 
        // When the response returned by REST has Http 
        // response code '200' 
        @Override 
        public void onSuccess(String response) { 
         result = Constants.RESULT_OK; 
         publishResults(Constants.URL_IMAGES_REPOSITORY + photoName, result, 0); 

        } 

        // When the response returned by REST has Http 
        // response code other than '200' such as '404', 
        // '500' or '403' etc 
        @Override 
        public void onFailure(int statusCode, Throwable error, 
              String content) { 

         // When Http response code is '404' 
         if (statusCode == 404) { 
          result = Constants.RESULT_FAIL_404; 

          publishResults(Constants.EMPTY_TAG, result, statusCode); 
         } 
         // When Http response code is '500' 
         else if (statusCode == 500) { 
          result = Constants.RESULT_FAIL_500; 
          publishResults(Constants.EMPTY_TAG, result, statusCode); 
         } 
         // When Http response code other than 404, 500 
         else { 
          result = Constants.RESULT_FAIL; 
          publishResults(Constants.EMPTY_TAG, result, statusCode); 
         } 
        } 
       }); 
    } 


    private void publishResults(String mUrl, int result, int statusCode) { 

     Intent intent = new Intent(Constants.NOTIFICATION); 
     intent.putExtra(Constants.INTENT_SERVICE_PHOTO, mUrl); 
     intent.putExtra(Constants.INTENT_SERVICE_RESULT, result); 
     intent.putExtra(Constants.INTENT_SERVICE_STATUS_CODE, statusCode); 
     sendBroadcast(intent); 
    } 
} 

Dritter Schritt rufen die IntentService:

Intent intent = new Intent(this, SendImageServer.class); 
// add info for the service which file to download and where to store 
intent.putExtra(Constants.INTENT_SERVICE_FILE_PATH, mFilePath); 
startService(intent); 

Vierter Schritt Erstellen Sie einen Broadcast-Empfänger, um das Upload-Ergebnis zu kommunizieren:

private BroadcastReceiver mReceiverPhoto = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Bundle bundle = intent.getExtras(); 
      if(mProgDialog.isShowing()) 
      { 
       mProgDialog.dismiss(); 
      } 
      if (bundle != null) { 
       String mUrl = bundle.getString(Constants.INTENT_SERVICE_PHOTO); 
       int resultCode = bundle.getInt(Constants.INTENT_SERVICE_RESULT); 
       int statusCode = bundle.getInt(Constants.INTENT_SERVICE_STATUS_CODE); 
       if (resultCode == Constants.RESULT_OK) { 
        mUser.setmProfilePhoto(mUrl); 
        ((NewUserActivity) context).setPhoto(mUrl); 
       } 
       else if (resultCode == Constants.RESULT_FAIL_404) { 
        Toast.makeText(getApplicationContext(), 
          getString(R.string.constants_resource_not_found_error), 
          Toast.LENGTH_LONG).show(); 
       } 
       else if (resultCode == Constants.RESULT_FAIL_500) { 
        Toast.makeText(getApplicationContext(), 
          getString(R.string.constants_server_error), 
          Toast.LENGTH_LONG).show(); 
       } 
       else if (resultCode == Constants.RESULT_FAIL) { 
        Toast.makeText(
          getApplicationContext(), 
          getString(R.string.constants_generic_http_error) 
            + statusCode, Toast.LENGTH_LONG) 
          .show(); 
       }else { 
        Toast.makeText(NewUserActivity.this, getString(R.string.constants_download_failed), 
          Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 
    }; 

Fünfter Schritt Ihr Register Rundfunkempfänger:

registerReceiver(mReceiverPhoto, new IntentFilter(Constants.NOTIFICATION)); 

nicht deregistrieren Sie vergessen, wenn nicht mehr Sie es brauchen.

+0

Hallo, danke, dass du Zeit gefunden hast und das geschrieben hast, aber ich brauche nur den Code auf der Serverseite. Auch das Bild, das ich hochladen möchte, muss in der Tabelle gespeichert werden, in der bereits ein Datensatz des Benutzers existiert. Also müsste ich nur diesen Datensatz mit Bild aktualisieren. –

+0

Die Art, wie ich etwas entwickelt habe, wie Sie brauchen, war in einem Ordner das Benutzerbild und die URL in der Datenbank zu speichern, weil später war es einfacher, das Bild zurück zu bekommen, um es in meiner App mit Picasso zu zeigen, anstatt das Benutzerbild in der Datenbank zu speichern . Ich denke, es ist nicht die Vorgehensweise, wie Sie brauchen, Entschuldigung, dass ich Ihre Frage missverstanden habe. –

+0

Nun, Ihre Herangehensweise ist wirklich gut und ich denke auch darüber nach. Speichern der URL des Bildes in der Datenbank. Aber welche Art von Daten werde ich aus der Anwendung senden.Ich meine, wenn Benutzer ein Bild aus der Galerie zum Beispiel wählen, wie werde ich dieses Bild an die Datenbank senden und nur die URL des Bildes speichern? –

Verwandte Themen