【问题标题】:Image is not generating/uploading in the server图像未在服务器中生成/上传
【发布时间】:2019-05-24 16:15:58
【问题描述】:

我正在开发一个 android 应用程序,我想在其中将图像保存在服务器(免费服务器 000webhost)上。为此,我使用 base64 将我的图像编码为字符串。并通过 POST 方法使用 volley 发送此字符串。 但是图像不是在服务器端生成的。谁能告诉我怎么了?

上传.php

<?php

$servername = "localhost";
$database = "id8258200_image";
$username = "id8258200_qmine1";
$password = "";


$conn = mysqli_connect($servername, $username, $password, $database);


if (!$conn) {
   die("Connection failed: " . mysqli_connect_error());
 }

echo "Connected successfully";

 if(isset($_POST["image"])){

$encoded_string = $_POST["image"];

$image_name="img";
$decoded_string = base64_decode($encoded_string);

$path = "image/$image_name.jpeg";

$file = fopen($path, 'wb');

$is_written = fwrite($file, $decoded_string);
fclose($file);
echo "success";
 }
 else {
      echo "error";
 }
?>

Mainactivity.java

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

public static final String UPLOAD_URL = "https://qmine.000webhostapp.com/question/upload.php";


private int PICK_IMAGE_REQUEST = 1;

private Button buttonChoose;
private Button buttonUpload;
private Button buttonView;

private ImageView imageView;

private Bitmap bitmap;

private Uri filePath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    buttonChoose = (Button) findViewById(R.id.buttonChoose);
    buttonUpload = (Button) findViewById(R.id.buttonUpload);
    buttonView = (Button) findViewById(R.id.buttonViewImage);

    imageView = (ImageView) findViewById(R.id.imageView);

    buttonChoose.setOnClickListener(this);
    buttonUpload.setOnClickListener(this);
    buttonView.setOnClickListener(this);
}

private void showFileChooser() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}

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

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {

        filePath = data.getData();
        try {
            bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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);
    Log.d("tr", "qwerty" + encodedImage);
    return encodedImage;
}

private void uploadImage() {

    RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
    StringRequest request = new StringRequest(Request.Method.POST, UPLOAD_URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getApplicationContext(), "errorrrr", Toast.LENGTH_SHORT).show();
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {

            Map<String, String> Params = new HashMap<String, String>();
            String img = getStringImage(bitmap);
            Log.d("qw", "aasas" + img);
            Params.put("image", img);
            return Params;

        }

    };

    queue.add(request);

}

@Override
public void onClick(View v) {
    if (v == buttonChoose) {
        showFileChooser();
    }

    if (v == buttonUpload) {
        uploadImage();
    }

    if (v == buttonView) {
        viewImage();
    }
}

private void viewImage() {
    // startActivity(new Intent(this, ImageListView.class));
}
}

【问题讨论】:

  • 在 php 文件中回显 base64 字符串并检查字符串是否存在,这样您就会发现问题在于在服务器端或 android 端解码和保存图像无法发送 base64,所以只需 "echo $encoded_string; die()" 并且您将很快发现问题您还可以使用以下将 base64 转换为图像的网站来验证字符串是否有效codebeautify.org/base64-to-image-converter
  • 我检查了 base64 字符串是正确的,我在上面的网站上得到了准确的图像。
  • 这意味着所有工作都需要将图像保存到服务器,因此请检查保存图像的文件夹的权限,并记录图像保存失败的错误。
  • 我已授予文件夹的所有权限

标签: java php android web-services server


【解决方案1】:

代码对我来说看起来不错。似乎是权限问题。将这些行添加到 PHP 脚本的顶部。

<?php
ini_set('display_errors', 1); // telling PHP to explicitly print all errors
error_reporting(E_ALL); // Show all notices, warnings and fatal errors

第二件事是检查文件夹是否有足够的权限来写入文件。如果不存在,请授予写入权限,并查看代码是否有效。

希望这会有所帮助。编码愉快!

【讨论】:

  • 它没有显示错误。它只显示“连接成功”消息没有其他内容。服务器中仍然没有生成图像文件
  • 我也已授予该文件夹的所有权限。
猜你喜欢
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
相关资源
最近更新 更多