Как я могу загрузить изображение, выбранное из галереи на сервер PHP в Android?

Поэтому я могу без проблем позволить пользователю выбрать изображение из галереи (я проверил его, установив выбранное изображение в ImageView). Я сделал класс AsyncTask, который выполняет загрузку. Я передаю изображение в виде строки в кодировке base64 с помощью этой функции (которая, я думаю, работает нормально):

public String getStringImage(Bitmap bmp){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
return encodedImage;
}

Я также передаю имя пользователя сеанса в качестве параметра (для именования загружаемого изображения).

Вот AsyncTask Activity:

import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

public class BackgroundPhotoUpload extends AsyncTask<String, String, String> {
String encodedImage;
Context context;
String usernameSignUp;

BackgroundPhotoUpload(Context ctx) {
this.context = ctx;
}

@Override
protected String doInBackground(String... params) {
usernameSignUp = params[0];
encodedImage = params[1];
try {
String loginUrl = "xxx";
URL url = new URL(loginUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
String postData = URLEncoder.encode("encodedImage", "UTF-8") + "=" + URLEncoder.encode(encodedImage, "UTF-8") + "&"+ URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode(usernameSignUp, "UTF-8");
bufferedWriter.write(postData);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"));
String result = "";
String datarecieved = "";
while ((datarecieved = bufferedReader.readLine()) != null) {
result += datarecieved;
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return result;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;

}

@Override
protected void onPreExecute() {
Toast.makeText(context,"Starting Upload", Toast.LENGTH_SHORT).show();
}

@Override
protected void onPostExecute(final String result) {
Toast.makeText(context, "Uploaded!", Toast.LENGTH_SHORT).show();
}
}

Вот как я вызываю класс AsyncTask из основного класса:

BackgroundPhotoUpload backgroundWorker = new BackgroundPhotoUpload(this);
backgroundWorker.execute(usernameSignUp, encodedString);

При развертывании приложения я вижу только первое сообщение Toast:

@Override
protected void onPreExecute() {
Toast.makeText(context,"Starting Upload", Toast.LENGTH_SHORT).show();
}

Приложение вылетает, прежде чем дать второе сообщение тост:

@Override
protected void onPostExecute(final String result) {
Toast.makeText(context, "Uploaded!", Toast.LENGTH_SHORT).show();
}

PHP-скрипт, размещенный на сервере, работал отлично, когда я вводил данные вручную. Поэтому я думаю, что это проблема с классом AsyncTask.

Но вот скрипт PHP в любом случае:

<?php
require 'init.php';
if(isset($_GET["encodedImage"]) && isset($_GET["username"])) {
$imageEncoded = $_GET["encodedImage"];
$username = $_POST["username"];
$imageDecoded = base64_decode($imageEncoded);
$path = "images/profilePic_".$username.".jpg";
file_put_contents($path,$imageDecoded);
echo "Successfully updated!";
}
else {
echo "An error occurred.";
}

?>

Удивительно, почему только загрузка части изображения приводит к сбою приложения. Я сделал логин и страницу регистрации с той же активностью AsyncTask (различие, что и targetURL и заголовки), которые работают совершенно нормально.

Какие-либо решения этой проблемы?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …