2013-08-28 9 views
5

Wie die Beschreibung sagt, mache ich ein Foto in Android. Es wird komprimiert und zu einem byte[], dann base64encoded hinzugefügt. Er sendet mit JSON an meinen Webservice, wo es "entschlüsselt" werden soll und in einer SQL-Tabellenzeile gespeichert werden soll. Ich kann die codierte Zeichenfolge in einer separaten Zeile speichern, damit ich weiß, dass sie da ist.Base64 Bild von Android mit JSON an php Webservice senden, entschlüsseln, auf SQL speichern

Kann mir jemand das ansehen und mir zeigen, wo ich es falsch mache? * Sorry für den langen Code. Ich möchte nichts verpassen, wenn Hilfe angeboten wird!

ANDROID SIDE

@Override 
    protected String doInBackground(String... args) { 
     // TODO Auto-generated method stub 
     // Check for success tag 

     int success; 
     stream = new ByteArrayOutputStream(); 
     picture.compress(Bitmap.CompressFormat.JPEG, 50, stream); 
     image = stream.toByteArray(); 

     String ba1 = Base64.encodeToString(image, Base64.DEFAULT); 

     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MainScreen.this); 
     String post_username = sp.getString("username", "anon"); 

     try { 
      ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(); 
      params.add(new BasicNameValuePair("username", post_username)); 
      params.add(new BasicNameValuePair("picture", ba1)); 

      JSONObject json = jsonParser.makeHttpRequest(POST_COMMENT_URL, 
        "POST", params); 


      success = json.getInt(TAG_SUCCESS); 
      if (success == 1) { 
       Log.d("Picture Added!", json.toString()); 
       //finish(); 
       return json.getString(TAG_MESSAGE); 
      } else { 
       Log.d("Upload Failure!", json.getString(TAG_MESSAGE)); 
       return json.getString(TAG_MESSAGE); 

      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 

    } 

    protected void onPostExecute(String file_url) { 
     // dismiss the dialog once product deleted 
     pDialog.dismiss(); 
     if (file_url != null) { 
      Toast.makeText(MainScreen.this, file_url, Toast.LENGTH_LONG) 
        .show(); 
     } 

    } 
} 

} 

PHP SIDE

<?php 
require("config.inc.php"); 
if (!empty($_POST)) { 
    $user = $_POST['username']; 
    $data = $_POST['picture']; 
    $data = base64_decode($data); 
    $im = imagecreatefromstring($data); 
    header('Content-Type: image/jpeg', true); 
    ob_start(); 
    imagejpeg($im); 
    $imagevariable = ob_get_contents(); 
    ob_end_clean(); 

$query = "INSERT INTO pictures (username, photo, rawdata) VALUES (:user, :photo, :raw) "; 

$query_params = array(
    ':user' => $user, 
    ':photo' => $imagevariable, 
    ':raw' => $_POST['picture'] 
); 

try { 
    $stmt = $db->prepare($query); 
    $result = $stmt->execute($query_params); 
} 
catch (PDOException $ex) { 
    $response["success"] = 0; 
    $response["message"] = "Database Error. Couldn't add post!"; 
    die(json_encode($response)); 
} 
$response["success"] = 1; 
$response["message"] = "Picture Successfully Added!"; 
echo json_encode($response); 

} else { 
} 
?> 
+0

Welche Art von Wert ist 'rawdata' gesetzt wie in MySQL? Ein Blob oder etwas anderes? – Pitchinnate

+0

Ich verwende Rawdata, um zu bestätigen, dass es von der App in die Datenbank gelangt. rawdata ist nur eine Textzeile und speichert die base64-Daten. Ich brauche es nicht, nachdem ich das Bild dekodieren und speichern kann. Es war nur zum Testen. – JeffK

+0

Ich wäre auch glücklich mit Multiparteity, wenn jemand mich durchgehen könnte. Ich dachte darüber nach, herauszufinden, wie man diese Base64 entschlüsseln könnte. – JeffK

Antwort

5

Ich wollte meine Lösung, falls jemand Anderem, Schwierigkeiten hat, mit diesem. Ich komme immer zu S.O. Für Antworten bin ich an der Reihe, jemandem zu helfen. Ich hatte Probleme mit nicht genügend Speicherfehlern unter Verwendung der Bitmaps. Ich änderte es zu einem mehrteiligen Posten, um das Bild als eine Datei und eine Schnur wie ihr Name hochzuladen, aber Sie konnten irgendeine Zeichenkette ihr hinzufügen. Der erste Teil ist die Android-Seite und darunter ist der PHP für die Datenbank. Das Bild wird zu einer Datei im Verzeichnis mit der Move-Datei-Methode hinzugefügt. Die Datenbank speichert den Pfad zu diesem Bild. Ich suchte nach zwei Tagen, um es alle von Stapelüberlaufpfosten zusammenzufügen.

ANDROID

public void onClick(View v) { 
    if (v.getId() == R.id.capture_btn) { 
     try { 

      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(intent, CAMERA_IMAGE_CAPTURE); 

     } catch (ActivityNotFoundException anfe) { 

      String errorMessage = "Whoops - your device doesn't support capturing images!"; 
      Toast toast = Toast.makeText(this, errorMessage, 
        Toast.LENGTH_SHORT); 
      toast.show(); 

     } 

    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == CAMERA_IMAGE_CAPTURE 
      && resultCode == Activity.RESULT_OK) { 
     getLastImageId(); 

     new PostPicture().execute(); 
    } 
} 

private int getLastImageId() { 
    // TODO Auto-generated method stub 
    final String[] imageColumns = { MediaStore.Images.Media._ID, 
      MediaStore.Images.Media.DATA }; 
    final String imageOrderBy = MediaStore.Images.Media._ID + " DESC"; 
    Cursor imageCursor = managedQuery(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, 
      null, null, imageOrderBy); 
    if (imageCursor.moveToFirst()) { 
     int id = imageCursor.getInt(imageCursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media._ID)); 
     fullPath = imageCursor.getString(imageCursor 
       .getColumnIndex(MediaStore.Images.Media.DATA)); 
     Log.d("pff", "getLastImageId: :id " + id); 
     Log.d("pff", "getLastImageId: :path " + fullPath); 
     return id; 

    } else { 
     return 0; 
    } 
} 

class PostPicture extends AsyncTask<String, String, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(MainScreen.this); 
     pDialog.setMessage("Uploading Picture"); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 

    } 

    @Override 
    protected String doInBackground(String... args) { 
     // TODO Auto-generated method stub 
     // Check for success tag 

     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost("http://www.your-php-page.php"); 

     try { 

      MultipartEntity entity = new MultipartEntity(
        HttpMultipartMode.BROWSER_COMPATIBLE); 
      File file = new File(fullPath); 
      cbFile = new FileBody(file, "image/jpeg"); 
      Log.d("sending picture", "guest name is " + guest_name); 
      Log.d("Sending picture", "guest code is " + guest_code); 
      entity.addPart("name", 
        new StringBody(guest_name, Charset.forName("UTF-8"))); 
      entity.addPart("code", 
        new StringBody(guest_code, Charset.forName("UTF-8"))); 
      entity.addPart("picture", cbFile); 
      post.setEntity(entity); 

      HttpResponse response1 = client.execute(post); 
      HttpEntity resEntity = response1.getEntity(); 
      String Response = EntityUtils.toString(resEntity); 
      Log.d("Response", Response); 

     } catch (IOException e) { 
      Log.e("asdf", e.getMessage(), e); 

     } 
     return null; 

    } 

    protected void onPostExecute(String file_url) { 
     // dismiss the dialog once product deleted 
     pDialog.dismiss(); 
     if (file_url != null) { 
      Toast.makeText(MainScreen.this, file_url, Toast.LENGTH_LONG) 
        .show(); 
     } 

    } 
} 

Und das ist die PHP. Beachten Sie auch, dass ich meine Datenbank-Anmeldeseite einbeziehe. Sie können Ihren d.b. Passwort und loggen Sie sich hier ein, aber ich entscheide mich nicht.

<?php 
require("config.inc.php"); 
if (!empty($_POST)) { 

if (empty($_POST['name'])) { 
    $response["success"] = 0; 
    $response["message"] = "Did not receive a name"; 
    die(json_encode($response));   
} else { 
    $name = $_POST['name']; 
} 


if (empty($_FILES['picture'])) { 
    $response["success"] = 0; 
    $response["message"] = "Did not receive a picture"; 
    die(json_encode($response));   
} else { 
    $file = $_FILES['picture']; 
} 


    $target_path = "uploads/whatever-you-want-it-to-be/"; 
      // It could be any string value above 

    /* Add the original filename to our target path. 
    Result is "uploads/filename.extension" */ 
    $target_path = $target_path . basename($_FILES['picture']['name']); 

    if(move_uploaded_file($_FILES['picture']['tmp_name'], $target_path)) { 
     echo "The file ". basename($_FILES['picture']['name']). 
     " has been uploaded"; 
    } else{ 
     $response["success"] = 0; 
     $response["message"] = "Database Error. Couldn't upload file."; 
     die(json_encode($response)); 
    } 

} else { 
    $response["success"] = 0; 
    $response["message"] = "You have entered an incorrect code. Please try again."; 
    die(json_encode($response)); 
} 

$query = "INSERT INTO name-of-table (directory, name, photo) VALUES (directory, :name, :photo) "; 

$query_params = array(
    ':directory' => $directory, 
    ':name' => $name, 
    ':photo' => $_FILES['picture']['name'] 
     ); 

try { 
    $stmt = $db->prepare($query); 
    $result = $stmt->execute($query_params); 
} 
catch (PDOException $ex) { 
    $response["success"] = 0; 
    $response["message"] = "Database Error. Couldn't add path to picture"; 
    die(json_encode($response)); 
} 
$response["success"] = 1; 
$response["message"] = "Picture Successfully Added!"; 
die (json_encode($response)); 


} 

?> 
+0

Können Sie den Rest Ihres Codes zeigen, was ist MultipartEntity und FileBody all diese Fehler? Vielen Dank! – Lion789

+0

@ Lion789 Möglicherweise geben Sie keine korrekte Datei weiter. Der obige Code ist vollständig, außer dass die Datei und die Strings definiert sind. Können Sie Ihren Code in einer neuen Frage posten und mir einen Link schicken? Ich werde versuchen zu helfen! – JeffK

+0

http://stackoverflow.com/questions/21192778/trying-to-use-async-with-image-upload-to-webserver-android Es gibt die Frage, die ich habe Dilemma mit dem Versuch, auf verschiedene Arten – Lion789

Verwandte Themen