2013-08-28 9 views
5

説明のように、私はAndroidで写真を撮っています。これを圧縮してbyte[]に追加し、次にbase64encodedに追加します。 JSONを私のWebサービスに送信し、そこでデコードされ、のSQLテーブル行に保存されます。コード化された文字列を別の行に保存することができます。AndroidからJSONを使用してBase64イメージをphp webserviceに送信、デコード、SQLに保存

誰でもこれを見て、私が間違っているところを教えてもらえますか? *長いコードは申し訳ありません。私は助けを受けているなら何かを逃したくない!

アンドロイド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と同じように設定されていますか?ブロブなど何か? – Pitchinnate

+0

私はrawdataを使って、アプリケーションからデータベースに至っていることを確認しています。 rawdataは単なるテキスト行で、base64データを格納します。画像をデコードして保存することができたら、私はそれを必要としません。それはテストのためのものでした。 – JeffK

+0

誰かが私の中を歩くことができるなら、私は多人数参加を使用して幸せになるでしょう。このbase64のデコード方法を簡単に理解できると思った。 – JeffK

答えて

5

私は他の誰がこれで問題を抱えている場合に私の解決策を投稿したかったです。私はいつもS.Oに来ます。答えは今のところ誰かを助けるための私の番です。ビットマップを使用したメモリ不足エラーで問題が発生しました。画像をファイルとしてアップロードし、名前のような文字列をアップロードするにはマルチパートポストに変更しましたが、任意の文字列を追加できます。最初の部分はアンドロイド側であり、その下はデータベース用のPHPです。画像は、ファイルの移動方法でディレクトリ内のファイルに追加されます。データベースにはその画像へのパスが格納されます。私はスタックオーバーフローポストからすべてをまとめて2日間探しました。

アンドロイド

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

関連する問題