Как сохранить изображение через захват в android на php?

Мы пробовали этот код для android и php. См. Ниже код.

Android

Scn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // Open default camera Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // start the image capture Intent startActivityForResult(intent, 100); } } protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == 100 && resultCode == RESULT_OK) { selectedImage = intent.getData(); imageBitmap = (Bitmap) intent.getExtras().get("data"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); imageBitmap.compress(Bitmap.CompressFormat.JPEG, 40, baos); imageView1.setImageBitmap(imageBitmap); byte[] imageBytes = baos.toByteArray(); String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); submitData(encodedImage); } } public void submitData(final String encodedImage) { try { new Thread(new Runnable() { @Override public void run() { try { //Looper.prepare(); Log.d("looper", "-->>>>"); try { isAuthorized = isAuthenticated(encodedImage); } catch (Exception e) { Log.e("Exception ==> ", e.toString()); } MHandler.post(new Runnable() { @Override public void run() { try { if(isAuthorized){ if(AuthenticationResultJSONObject!=null){ String message = AuthenticationResultJSONObject.getString("message"); if(AuthenticationResultJSONObject.getString("status").equalsIgnoreCase("1")) { Toast.makeText(ScannerActivity.this,message,Toast.LENGTH_SHORT).show(); } else if (AuthenticationResultJSONObject.getString("status").equalsIgnoreCase("0")) { Toast.makeText(ScannerActivity.this,message,Toast.LENGTH_SHORT).show(); } } } else { Toast.makeText(ScannerActivity.this, "Loing unsuccessfull, please try again !", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); Log.e("Exception 146==> ", e.toString()); } finally { //progressdialog.dismiss(); //progress.dismissProgressDialog(); } } }); } catch (Exception e) { Log.e("Exception 153==> ", e.toString()); } } }).start(); } catch (Exception e) { Log.e("Exception 159==> ", e.toString()); } } public boolean isAuthenticated(final String encodedImage) { isAuthorized = false; String encoder1 = ""; final String url="http://bestpeopleservice.com/projects/scanner/api/api/api.php?class=login&method=login_data&json="; String finalurl = "{\"data\":{\"qr_code\":\""+username1+"\",\"user_pass\":\""+password1+"\",\"longitude\":\""+longitude1+"\",\"latitude\":\""+latitude1+"\",\"adderss\":\""+adderss1+"\",\"images\":\""+encodedImage+"\"}}";// Log.v("267 1111111", "done url -> "+url+finalurl); try { encoder1 = URLEncoder .encode(finalurl,"UTF-8"); Log.v("267 222", "done url 2 -> "+url+encoder1); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } try { if (isNetworkConnected()) { AuthenticationResultJSONObject = new JSONObject(doFetchDataFromWebService_Simple_OnlyJSONResponse(url+encoder1)); Log.v("Online", "User json array === "+AuthenticationResultJSONObject); }else{ Toast.makeText(ScannerActivity.this, "Please check your internet connection and try again.", Toast.LENGTH_SHORT).show(); } } catch(Exception e){ e.getMessage(); } finally{ if(AuthenticationResultJSONObject!=null){ isAuthorized = true; } else { isAuthorized=false; } } // } // }); return isAuthorized; } // Checking the internet connection public boolean isNetworkConnected() { ConnectivityManager connectivitymanagar = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkinfo = connectivitymanagar.getActiveNetworkInfo(); if (networkinfo == null || !networkinfo.isConnectedOrConnecting()) { return false; } else { return true; } } public String doFetchDataFromWebService_Simple_OnlyJSONResponse( String WebServiceURL) { String responseBody = ""; JSONObject jobj = new JSONObject(); try { HttpGet WSHttpPost = null; HttpClient WSHttpClient = null; HttpResponse WSHttpResponse = null; WSHttpClient = getNewHttpClient(); WSHttpPost = new HttpGet(WebServiceURL); WSHttpResponse = WSHttpClient.execute(WSHttpPost); Log.d("resp", ""+WSHttpResponse); //responseBody = EntityUtils.toString(WSHttpResponse.getEntity()); responseBody = EntityUtils.toString(WSHttpResponse.getEntity(), "UTF-8"); Log.v("response1", "" + responseBody); } catch (Exception e) { Log.e("Exception2 ==> ", e.toString()); } if (responseBody == null || responseBody.equalsIgnoreCase("null")) { return ""; } else { return responseBody; } } public HttpClient getNewHttpClient() { try { KeyStore trustStore = KeyStore.getInstance(KeyStore .getDefaultType()); trustStore.load(null, null); SSLSocketFactory sf = new MySSLSocketFactory(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory .getSocketFactory(), 80)); registry.register(new Scheme("https", sf, 443)); ClientConnectionManager ccm = new ThreadSafeClientConnManager( params, registry); return new DefaultHttpClient(ccm, params); } catch (Exception e) { return new DefaultHttpClient(); } } public class MySSLSocketFactory extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }; sslContext.init(null, new TrustManager[] { tm }, null); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); } @Override public Socket createSocket() throws IOException { return sslContext.getSocketFactory().createSocket(); } } 

Он возвращает синтаксический анализ bytestring. Его значение слишком велико.

PHP

  $base=$Data['images']; $binary=base64_decode($base); header('Content-Type: bitmaps; charset=utf-8'); header("Content-Length: " . mb_strlen($base, '8bit')); $file = fopen('qr_code.jpeg', 'wb'); fwrite($file, $binary); fclose($file); echo 'Image upload complete!!, Please check your php file directory'; 

Над кодом работает. Но у него есть проблема. Сохранение изображения успешно в папке, но изображение будет отображаться как поврежденное. Как мы можем решить эту проблему.

Заранее спасибо.

Пожалуйста, попробуйте этот код, этот код работает для меня.

 <?php // Path to move uploaded files $target_path = "uploads/"; // array for final json respone $response = array(); // getting server ip address $server_ip = gethostbyname(gethostname()); // final file url that is being uploaded $file_upload_url = 'http://' . $server_ip . '/' . '/xyz/' . '/' . $target_path; if (isset($_FILES['image']['name'])) { $target_path = $target_path . basename($_FILES['image']['name']); // reading other post parameters $email = isset($_POST['email']) ? $_POST['email'] : ''; $website = isset($_POST['website']) ? $_POST['website'] : ''; $response['file_name'] = basename($_FILES['image']['name']); $response['email'] = $email; $response['website'] = $website; try { // Throws exception incase file is not being moved if (!move_uploaded_file($_FILES['image']['tmp_name'], $target_path)) { // make error flag true $response['error'] = true; $response['message'] = 'Could not move the file!'; } // File successfully uploaded $response['message'] = 'File uploaded successfully!'; $response['error'] = false; $response['file_path'] = $file_upload_url . basename($_FILES['image']['name']); } catch (Exception $e) { // Exception occurred. Make error flag true $response['error'] = true; $response['message'] = $e->getMessage(); } } else { // File parameter is missing $response['error'] = true; $response['message'] = 'Not received any file!F'; } // Echo final json response to client echo json_encode($response); ?> 

Я не и разработчик Android.

Но я знаю, что проблема связана с вашим запросом. Вы передаете все данные в методе запроса GET (добавление параметров в URL). Но он имеет ограничение в 2083 символа. (Это зависит от веб-сервера)

Итак, если ваш размер изображения выше, он просто усекает URL.

Для решения вам необходимо использовать запрос POST для отправки данных в webservice.

Android

См. Ответ на этот вопрос для фрагмента кода Android.

PHP-код

 <?php $json=json_decode($_POST['json']); //decoding json which is received from Android. $photo=$json->images; //get image data (which is encoded in base64) /* Decoding image */ $binary = base64_decode ( $photo ); /* Opening image */ $file = fopen ( 'file_name_to_create.jpeg', 'wb' ); /* Writing to server */ fwrite ( $file, $binary ); /* Closing image file */ fclose ( $file ); ?> 

Он создаст file_name_to_create.jpeg в текущем каталоге.

Справка

  1. Максимальная длина запроса GET
  2. Запрос POST с помощью Android

Привет, я использовал этот подход для сохранения myImage.

  • Создайте папку изображений внутри вашего корня.

    $ allowedExts = array ("gif", "jpeg", "jpg", "png");

    $ temp = explode (".", $ _FILES ["file"] ["name"]);

    $ extension = end ($ temp);

    move_uploaded_file ($ _ FILES ["file"] ["tmp_name"], "../images/". $ varFileName);

  • Используйте этот URL для загрузки моего кода для отправки файла образа на сервер php.

https://onedrive.live.com/redir?resid=D6874F5E96BBF5A8!17174&authkey=!AIA5xGcRI7UnyNg&ithint=folder%2cjar

  final Dictionary<String, String> dictionary = new Hashtable<String, String>(); dictionary.put("name", "kruti"); dictionary.put("file", "file");