php json传输base64,使用JSON从Android发送Base64图像到php webservice,解码,保存到SQL

就像描述中说的那样,我正在Android中拍照.它被压缩并添加到byte []然后base64encoded.它使用JSON发送到我的webservice,在那里它“被认为”被解码并保存在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 params = new ArrayList(); 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

<?phprequire ("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 {}?>解决方法:

我想发布我的解决方案,以防其他人遇到麻烦.我总是来到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(); } }}@Overrideprotected 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 { @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.密码并在这里登录,但我选择不这样做.

<?phprequire ("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));}?>来源:http://www.icode9.com/content-2-199051.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值