2016-10-26 3 views
0

все. Я застрял в этом проекте, над которым я работаю. Я хочу, чтобы иметь возможность загружать изображение из галереи Android, кодировать это изображение в строку base64 и отправлять в веб-службу PHP, как переменную get, а затем декодировать изображение с другого конца и делать с ним, как я хочу.Как загрузить изображение с android на php с помощью asynctask

Пока что я могу выбрать изображение, из галереи и даже закодировать строку base64 и сохранить в настройках андроида.

Проблема в том, что я думаю, что не вся строка отправляется на службу PHP (некоторые усекаются).

Почему я так думаю? Мой Log.d показал мне разные строки при сбрасывании в разных местах.

код, который получает изображение и кодирует это: -

private void galleryIntent() 
{ 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Please select a file"),1); 
} 

private String onSelectFromGalleryResult (Intent data) { 

    if (data != null) { 
     try { 
      bitmap = MediaStore.Images.Media.getBitmap(getContext().getContentResolver() , data.getData()) ; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream() ; 

     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream) ; 

     byte[] imageBytes = byteArrayOutputStream.toByteArray() ; 

     Log.d ("Selected Image Gallery" , Base64.encodeToString(imageBytes, Base64.DEFAULT)) ; 

     return Base64.encodeToString (imageBytes, Base64.DEFAULT) ; 
    } else { 
     return null ; 
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    SharedPreferences sharedPreferences = getContext().getSharedPreferences("MyOnActivityResultPref" , Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit() ; 

    if (resultCode == Activity.RESULT_OK) { 

     if (requestCode == 1) { 
      /*Here we handle the image gotten from the gallery*/ 
      String encodedGalleryImage = onSelectFromGalleryResult(data); 

      editor.putString("userEncodedGalleryImage" , encodedGalleryImage); 

     } else if (requestCode == 0) { 
      /*Here we handle the image that was take using the camera*/ 

     } 

     editor.apply(); 
    } 
} 

Здесь мы называем класс AsyncTask

private void callAsynctask() { 
    SharedPreferences sp = getContext().getSharedPreferences("MyOnActivityResultPref" , Context.MODE_PRIVATE); 

    String userQuestionAttachement = sp.getString("userEncodedGalleryImage" , "") ; 

Log.d("callingEncodedImage" , userQuestionAttachement) ; 
} 

У меня есть проблема в том, что бревно из Log.d ("Selected Галерея изображений ", Base64.encodeToString (imageBytes, Base64.DEFAULT)); отличается от Log.d («callEncodedImage», userQuestionAttachement);

Там оба имеют одинаковый начало, но различные окончания. Я ожидаю увидеть те же персонажи.

Может кто-нибудь, пожалуйста, помогите мне разобраться?

+0

base64 string иногда может быть слишком большим для отправки за один раз. Лучше будет загружать файл изображения с помощью multipart. –

+0

Привет @VivekMishra, как вы это сделаете? Я думаю, что это то, что мне нужно! ... –

ответ

1

В Android

new UploadFileAsync().execute(""); 



    private class UploadFileAsync extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 

     try { 
    String sourceFileUri = "/mnt/sdcard/abc.png"; 

      HttpURLConnection conn = null; 
      DataOutputStream dos = null; 
      String lineEnd = "\r\n"; 
      String twoHyphens = "--"; 
      String boundary = "*****"; 
      int bytesRead, bytesAvailable, bufferSize; 
      byte[] buffer; 
      int maxBufferSize = 1 * 1024 * 1024; 
      File sourceFile = new File(sourceFileUri); 

      if (sourceFile.isFile()) { 

       try { 
        String upLoadServerUri = "http://website.com/abc.php?"; 

        // open a URL connection to the Servlet 
        FileInputStream fileInputStream = new FileInputStream(
          sourceFile); 
        URL url = new URL(upLoadServerUri); 

        // Open a HTTP connection to the URL 
        conn = (HttpURLConnection) url.openConnection(); 
        conn.setDoInput(true); // Allow Inputs 
        conn.setDoOutput(true); // Allow Outputs 
        conn.setUseCaches(false); // Don't use a Cached Copy 
        conn.setRequestMethod("POST"); 
        conn.setRequestProperty("Connection", "Keep-Alive"); 
        conn.setRequestProperty("ENCTYPE", 
          "multipart/form-data"); 
        conn.setRequestProperty("Content-Type", 
          "multipart/form-data;boundary=" + boundary); 
        conn.setRequestProperty("bill", sourceFileUri); 

        dos = new DataOutputStream(conn.getOutputStream()); 

        dos.writeBytes(twoHyphens + boundary + lineEnd); 
        dos.writeBytes("Content-Disposition: form-data; name=\"bill\";filename=\"" 
          + sourceFileUri + "\"" + lineEnd); 

        dos.writeBytes(lineEnd); 

        // create a buffer of maximum size 
        bytesAvailable = fileInputStream.available(); 

        bufferSize = Math.min(bytesAvailable, maxBufferSize); 
        buffer = new byte[bufferSize]; 

        // read file and write it into form... 
        bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

        while (bytesRead > 0) { 

         dos.write(buffer, 0, bufferSize); 
         bytesAvailable = fileInputStream.available(); 
         bufferSize = Math 
           .min(bytesAvailable, maxBufferSize); 
         bytesRead = fileInputStream.read(buffer, 0, 
           bufferSize); 

        } 

        // send multipart form data necesssary after file 
        // data... 
        dos.writeBytes(lineEnd); 
        dos.writeBytes(twoHyphens + boundary + twoHyphens 
          + lineEnd); 

        // Responses from the server (code and message) 
        serverResponseCode = conn.getResponseCode(); 
        String serverResponseMessage = conn 
          .getResponseMessage(); 

        if (serverResponseCode == 200) { 

         // messageText.setText(msg); 
         //Toast.makeText(ctx, "File Upload Complete.", 
         //  Toast.LENGTH_SHORT).show(); 

         // recursiveDelete(mDirectory1); 

        } 

        // close the streams // 
        fileInputStream.close(); 
        dos.flush(); 
        dos.close(); 

       } catch (Exception e) { 

        // dialog.dismiss(); 
        e.printStackTrace(); 

       } 
       // dialog.dismiss(); 

      } // End else block 


     } catch (Exception ex) { 
      // dialog.dismiss(); 

      ex.printStackTrace(); 
     } 
     return "Executed"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 

    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
    } 
} 

В Php,

<?php 


    if (is_uploaded_file($_FILES['bill']['tmp_name'])) { 
    $uploads_dir = './'; 
          $tmp_name = $_FILES['bill']['tmp_name']; 
          $pic_name = $_FILES['bill']['name']; 
          move_uploaded_file($tmp_name, $uploads_dir.$pic_name); 
          } 
       else{ 
        echo "File not uploaded successfully."; 
      } 

    ?> 
+0

Здравствуйте @Magash. У меня уже есть код Asynctask и служба PHP. Моя проблема находится где-то между, закодированная строка усекается. Я не знаю, почему ... –

+0

Спасибо за код PHP! Это сработало для меня. Я добавил конструктор к расширенному классу AsyncTask, который принимает путь входного файла и IP-адрес в качестве параметров. с такими незначительными изменениями код работал должным образом. – user3188777

0

Чтобы загрузить изображение, используя Multipart выполните следующие действия:

  1. Скачать httpmime.jar файл и добавить его в ваши libs папка.

  2. Скачать файл http client.jar и добавить его в ваш libs папку.

Вызвать следующий метод либо из фоновой нити, либо из AsyncTask.

public void executeMultipartPost() throws Exception { 
    try { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     bm.compress(CompressFormat.JPEG, 75, bos); 
     byte[] data = bos.toByteArray(); 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpPost postRequest = new HttpPost(
       "YOUR SERVER URL"); 
     ByteArrayBody bab = new ByteArrayBody(data, "YOUR IMAGE.JPG"); 

     MultipartEntity reqEntity = new MultipartEntity(
       HttpMultipartMode.BROWSER_COMPATIBLE); 
     reqEntity.addPart("IMAGE", bab); 

     postRequest.setEntity(reqEntity); 
     HttpResponse response = httpClient.execute(postRequest); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       response.getEntity().getContent(), "UTF-8")); 
     String sResponse; 
     StringBuilder s = new StringBuilder(); 

     while ((sResponse = reader.readLine()) != null) { 
      s = s.append(sResponse); 
     } 
     System.out.println("Response: " + s); 
    } catch (Exception e) { 
     // handle exception here 
     Log.e(e.getClass().getName(), e.getMessage()); 
    } 
} 
Смежные вопросы