2016-07-17 7 views
0

У меня есть требование, чтобы изображение пользователя загружалось в приложение из базы данных с использованием метода POST. Здесь мне нужно передать userId через метод POST для PHP и получить изображение в качестве ответа. Это изображение я сохраню и покажу его в ImageView. Я уже делал это в iOS и прекрасно работал там, но для Android мне нужна помощь.Как загрузить изображение из базы данных с помощью метода POST

Я сделал много Googling, но нашел только учебники для загрузки изображения с использованием метода GET или прямого метода URL, но не метода POST. Пожалуйста, помогите мне с любым примером кода, используя метод POST. Файл PHP, который я уже использую для ios, приведен ниже.

<?php 

require("userdao.php"); 
... 
$userId = htmlentities($_POST["userId"]); 

$returnValue = array(); 
$dao = new userdao($dbhost, $dbuser, $dbpass, $dbname); 
$dao->openConnection(); 
$userPhoto = $dao->getUserPhoto($userId); 
$returnValue = $userPhoto["user_photo"]; 
$dao->closeConnection(); 

echo ($returnValue); 
return; 
?> 

Edit: Вот некоторая дополнительная информация, Изображений сохраняются в базе данных BLOB. Вышеупомянутый php требует ввода userid & получает соответствующее изображение из таблицы, а затем просто возвращает его обратно. Здесь нет json_encode. У меня есть другие php для этого приложения, которые выполняют строковые запросы &, получая ответы с помощью volley & thats all fine. Но для этого конкретного мне нужно изображение в качестве ответа, я не могу найти код для запроса изображения или запроса Bitmap, который мог бы отправить один параметр, используя метод POST & получить ответ изображения. Этот php является общим для ios & android. Мне нужен код для Android, чтобы сделать эту работу. Еще одна вещь, после многого поиска, я опубликовал этот вопрос. Любая помощь приветствуется.

+0

No. Загрузка не производится методом POST. Только запрос на загрузку отправляется на сервер. После этого файл просто отправляется поверх потока и, следовательно, получает его. – greenapps

+0

Просто покажите PHP-код для запроса GET. Вам придется немного изменить, чтобы он работал с POST. Вы также можете очень легко сделать так, чтобы работали как GET, так и POST. – greenapps

+0

Или ваш php-скрипт работает нормально для POST, и вы только запрашиваете код Android? Не понятно. – greenapps

ответ

0

Я сделал это, хотя не напрямую, а с работой вокруг. Я преобразовал изображение в строку base64 в php. В android я использовал StringRequest для POST userid & получил кодированную строку, а затем расшифрованную строку & преобразовал ее обратно в изображение.

PHP код: userPhoto.php

<?php 

... 
$userId = htmlentities($_POST["userId"]); 
... 
$userImage= $userPhoto["user_photo"]; 
$returnValue["userIdEncoded"] = base64_encode($userImage); 
... 

echo json_encode($returnValue); 
return; 
?> 

Android код: Создано новый Java-файл, чтобы получить данные из базы данных:

import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.toolbox.StringRequest; 

import java.util.HashMap; 
import java.util.Map; 

public class PhotoRequest extends StringRequest { 

    private static final String photoRequestUrl = "http://.../php/userPhoto.php"; 
    private Map<String, String> params; 

    public PhotoRequest (String userId, Response.Listener<String> listener, Response.ErrorListener errorListener){ 
     super(Request.Method.POST, photoRequestUrl, listener, errorListener); 
     params = new HashMap<>(); 
     params.put("userId", userId); 
    } 

    @Override 
    public Map<String, String> getParams() { 
     return params; 
    } 
} 

Добавлен следующий код MainActivity для сохранения изображения:

Response.Listener<String> photoResponseListener = new Response.Listener<String>() { 

    @Override 
    public void onResponse(String imageResponse) { 
     try { 
      JSONObject jsonResponse = new JSONObject(imageResponse); 

      final String userPhotoEncodedString = jsonResponse.getString("userIdEncoded"); 
      final byte[] decodedString = Base64.decode(userPhotoEncodedString, Base64.DEFAULT); 
      Bitmap decodedImage = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 

      ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
      File imageDirectory = cw.getDir("imageDir", Context.MODE_PRIVATE); 
      boolean isDirectoryExists = imageDirectory.exists(); 
      if (!isDirectoryExists) { 
       isDirectoryExists = imageDirectory.mkdir(); 
       } 
      System.out.println("isDirectoryExists:" + isDirectoryExists); 

      File imagePath = new File(imageDirectory, "userPhoto.png"); 
      boolean isFileExists = imagePath.exists(); 
      if(isFileExists){ 
       isFileExists = imagePath.delete(); 
      } 
      System.out.println(isFileExists); 

      FileOutputStream fos; 
      try { 
       fos = new FileOutputStream(imagePath); 
       decodedImage.compress(Bitmap.CompressFormat.PNG, 100, fos); 
       fos.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     } 
    }; 

    PhotoRequest photoRequest = new PhotoRequest(userId, photoResponseListener, null); 
    RequestQueue queue = Volley.newRequestQueue(LoginPage.this); 
    queue.add(photoRequest); 

Следующий код для отображения изображение из сохраненного файла:

final ImageView ivUserPhoto = (ImageView) findViewById(R.id.ivUserPhoto); 

try { 
    ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
    File imageDirectory = cw.getDir("imageDir", Context.MODE_PRIVATE); 
    File imagePath = new File(imageDirectory, "userPhoto.png"); 
    Bitmap userImage = BitmapFactory.decodeStream(new FileInputStream(imagePath)); 
    ivUserPhoto.setImageBitmap(userImage); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
+0

Я добавил код выше, если он кому-то поможет. – Karthik

Смежные вопросы