将图片上传到服务器php-mysql(Android)

3
我想将我的图片保存到php-my-sql数据库中... 我在add-img字段中有一张图片,请查看我的代码。
     protected void onActivityResult(int requestCode, int resultCode, Intent  data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        InputStream inputStream;
        if (requestCode == 1 && resultCode == RESULT_OK && data != null) {

          Bitmap bmp = (Bitmap) data.getExtras().get("data");
            add_img.setImageBitmap(bmp);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.PNG, 90, stream);
            byte[] byte_arr = stream.toByteArray();
            imageString = Base64.encodeBytes(byte_arr);
      }
     }

我正在将图像字符串值传递给异步任务活动。
          protected String doInBackground(String... args) {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            email_value="gdfgdfgd";
            params.add(new BasicNameValuePair("email_id",email_value));
            params.add(new BasicNameValuePair("image",imageString));
            JSONObject json = jsonParser.makeHttpRequest(url_create_image,
                    "POST", params);
            Log.d("Create Response", json.toString());
            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {

                } else {
                    // failed to create product
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

我的Json解析器类是:

        public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy); 
        try {
            if(method.equals("POST")){
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }else if(method.equals("GET")){
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);
                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }           


        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        try {
        jObj = new JSONObject(json);

        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }}

我的PHP字符串URL是

<?php

$response = array();
if (isset($_POST['email_id'])) 
 {   
 $base= $_POST['image'];
  $buffer = base64_decode($base);
  $buffer = mysql_real_escape_string($buffer);
  $email = $_POST['email_id'];

  require_once __DIR__ . '/db_connect.php';
  $db = new DB_CONNECT();
  $result = mysql_query("INSERT INTO image_table(email,image)   VALUES('$email ','$buffer')");
  if ($result) {
    $response["success"] = 1;
    $response["message"] = "Image successfully Added.";
    echo json_encode($response);
   } else {
    $response["success"] = 0;
    $response["message"] = "Oops! An error occurred.";
    echo json_encode($response);
  }
 } else {
  $response["success"] = 0;
  $response["message"] = "Required field(s) is missing";
  echo json_encode($response);
}
 ?>      

i got error like

 03-20 02:08:38.276: E/JSON Parser(2574): Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
03-20 02:08:38.286: E/AndroidRuntime(2574): FATAL EXCEPTION: AsyncTask #1
03-20 02:08:38.286: E/AndroidRuntime(2574): Process: com.big_property, PID: 2574
03-20 02:08:38.286: E/AndroidRuntime(2574): java.lang.RuntimeException: An error occured while executing doInBackground()
03-20 02:08:38.286: E/AndroidRuntime(2574):     at android.os.AsyncTask$3.done(AsyncTask.java:300)
03-20 02:08:38.286: E/AndroidRuntime(2574):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
03-20 02:08:38.286: E/AndroidRuntime(2574):     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
03-20 02:08:38.286: E/AndroidRuntime(2574):     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
03-20 02:08:38.286: E/AndroidRuntime(2574):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
03-20 02:08:38.286: E/AndroidRuntime(2574):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-20 02:08:38.286: E/AndroidRuntime(2574):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-20 02:08:38.286: E/AndroidRuntime(2574):     at java.lang.Thread.run(Thread.java:841)
03-20 02:08:38.286: E/AndroidRuntime(2574): Caused by: java.lang.NullPointerException
03-20 02:08:38.286: E/AndroidRuntime(2574):     at com.big_property.Post_Property_Activity3$CreateNewFloor.doInBackground(Post_Property_Activity3.java:378)
03-20 02:08:38.286: E/AndroidRuntime(2574):     at com.big_property.Post_Property_Activity3$CreateNewFloor.doInBackground(Post_Property_Activity3.java:1)
03-20 02:08:38.286: E/AndroidRuntime(2574):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
03-20 02:08:38.286: E/AndroidRuntime(2574):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-20 02:08:38.286: E/AndroidRuntime(2574):     ... 4 more


帮帮我,朋友...我需要你的帮助。 - Tufan
json.toString() 的值是什么? - Fahim
JSONObject json!json为空。 - Tushar Gogna
那么解决方案是什么呢?当我对其他值(如varchar)执行时,它是正确的,但是当我对blob字段执行时,它是错误的。 - Tufan
看起来你的 PHP 代码正在发送错误的响应,请先尝试打印 JSON 响应。在 json=sb.toString(); 后面发布问题。 - Harin
我尝试过Harry...请看我的评论,对于varchar字段是正确的,但当我改为blob时,它被强制关闭了...我认为错误可能在于$buffer = mysql_real_escape_string($buffer); 但如何修复它呢? - Tufan
1个回答

2
正如@Harry所指出的那样,PHP代码似乎没有发送可解析为JSONObject的响应。

这个日志条目:

E/JSON Parser(2574): Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject

意味着代码在此处抛出了异常:
 try {
    jObj = new JSONObject(json);

    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

所以,由于这个原因jObj仍然是null。

因此,在你遇到异常之前添加日志记录以查看响应内容:

 try {
    Log.d("JSON Parser", "json response: " + json);
    jObj = new JSONObject(json); //Throwing an exception

    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

为避免出现空指针异常,请修改以下代码:
```java ```
     //Check if not null before referencing json object to prevent NPE
     if (json != null){   
       Log.d("Create Response", json.toString());
        try {
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {

            } else {
                // failed to create product
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
      }
      else{
         Log.e("doInBackground", "json is null");
      }

编辑:查看日志并进行了一些研究后,似乎您需要MySQL连接才能使用mysql_real_escape_string()

在您的PHP中尝试以下代码:

<?php

$response = array();
if (isset($_POST['email_id'])) 
 {   
 $base= $_POST['image'];
  $buffer = base64_decode($base);
  $email = $_POST['email_id'];

  require_once __DIR__ . '/db_connect.php';
  $db = new DB_CONNECT();
  $query = sprintf("INSERT INTO image_table(email,image)   VALUES('%s','%s')", $email, mysql_real_escape_string($buffer));

  $result = mysql_query($query);
  if ($result) {
   ............

注意:在使用mysql_real_escape_string()之前需要建立一个MySQL连接,否则会生成E_WARNING级别的错误,并返回FALSE。如果link_identifier未定义,则使用最后一个MySQL连接。

嘿,丹尼尔,Not出现了错误,如下所示: 03-20 03:36:15.335: D/JSON Parser(2918): <b>警告</b>: mysql_real_escape_string():在<b>/home/xmveznfp/public_html/big/add_image.php</b>的第<b>8</b>行,用户'xmveznfp'@'localhost'被拒绝访问(未使用密码)。 - Tufan
你知道如何配置mysql_real_escape_string吗? - Tufan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接