2013-08-28 80 views
5

像描述說的,我正在Android拍照。它被壓縮並添加到byte[],然後base64encoded。它與JSON發送到我的web服務,它被「假定」被解碼並保存在SQL錶行中。我可以將編碼的字符串保存在一個單獨的行中,所以我知道它到達那裏。從Android發送Base64圖像與JSON到PHP Web服務,解碼,保存到SQL

任何人都可以看看這個,並告訴我我做錯了嗎? *對於冗長的代碼抱歉。如果被提供幫助,我不想錯過任何東西!

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端

<?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

什麼類型的值是'rawdata'在MySQL中設置的? Blob還是別的? – Pitchinnate

+0

我正在使用rawdata來確認它是從應用程序一直到數據庫。 rawdata只是一個文本行並存儲了base64數據。解碼並存儲圖像後,我不需要它。這只是爲了測試。 – JeffK

+0

如果有人能夠通過它,我也會很高興使用多方。我想過如何解碼這個base64會更容易。 – JeffK

回答

5

我想後我的情況下,其他人是否有這個麻煩解決方案。我總是來到S.O.所以現在輪到我幫助別人了。我使用位圖時遇到內存不足錯誤。我將其更改爲多部分文章,將圖片作爲文件和字符串上傳到他們的名字中,但您可以添加任何字符串。第一部分是android側,下面是數據庫的php。使用移動文件方法將圖片添加到目錄中的文件。數據庫存儲該圖片的路徑。我搜索了兩天,將所有內容從堆棧溢出文章中分離出來。

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(); 
     } 

    } 
} 

這是PHP。另外請注意,我包括我的數據庫登錄頁面。你可以輸入你的d.b.密碼和登錄在這裏,但我選擇不。

<?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

你可以顯示你的代碼的其餘部分,什麼是MultipartEntity和FileBody所有這些都是錯誤的?謝謝! – Lion789

+0

@ Lion789您可能未傳遞正確的文件。除了定義文件和字符串之外,上面的代碼是完整的。你可以在新的問題中發佈你的代碼併發送給我一個鏈接嗎?我會盡力幫助! – JeffK

+0

http://stackoverflow.com/questions/21192778/trying-to-use-async-with-image-upload-to-webserver-android有問題我有兩難試圖以不同的方式 – Lion789

相關問題