如何将图像上传到现有的MySql数据库?

时间:2016-04-01 11:06:55

标签: php android mysql image

我正在创建一个Android应用程序,并且我正在尝试为用户存储个人资料图片。当用户注册时,他被记录在表格中,我在那里插入了另外一个字段image,我将为他存储图像。但我想我在发送查询时需要使用PUT请求方法。我根据用户ID上传该图像,并验证每个用户在注册时获得的key-api。这就是我到目前为止所做的:

public function uploadImage($user_id, $image, $status) {
    $path = "uploads/$user_id.png";
    $actualpath = "http://localhost:8081/timster/uploads/$path";
    $stmt = $this->conn->prepare("UPDATE users SET image = $actualpath, status = ? WHERE id = ?");
    $stmt->bind_param("sii", $image, $status, $id);
    $stmt->execute();
    $num_affected_rows = $stmt->affected_rows;
    $stmt->close();
    return $num_affected_rows > 0;
}

我真的卡住了,我不知道下一步该怎么做。 这就是我发送更新users表格和上传图片的查询方式。

$app->put('/image/:id', 'authenticate', function($user_id) use ($app) {

    // check for required params
    verifyRequiredParams(array('image', 'status'));

    global $user_id;
    $image = $app->request->put('image');
    $status = $app->request->put('status');

    $db = new DbHandler();
    $response = array();

    $result = $db->uploadImage($user_id, $image, $status);
    if ($result) {
        $response["error"] = false;
        $response["message"] = "Image uploaded successfully";
    } else {
        $response["error"] = true;
        $response["message"] = "Image failed to upload";
    }
    echoRespnse(200, $response);
});

我没有运行此功能来检查它是否正常工作,但我确定我需要在功能uploadImage()中添加更多功能。

因此,例如,这是我的网址在发送PUT请求时的外观。 http://localhost:8081/timster/v1/image/2。最后一个数字是我想要上传新图像的用户的ID。

1 个答案:

答案 0 :(得分:1)

这里有一些我很久以前开发的将代码上传到PHP服务器的代码,希望能有所帮助。

第一步创建php服务器端:

<?php
    // Get image string posted from Android App
    $base=$_REQUEST['image'];
    // Get file name posted from Android App
    $filename = $_REQUEST['filename'];
    // Decode Image
    $binary=base64_decode($base);
    header('Content-Type: bitmap; charset=utf-8');
    // Images will be saved under './uplodedimages' folder
    $file = fopen('uploadedimages/'.$filename, 'wb');
    // Create File
    fwrite($file, $binary);
    fclose($file);
    echo 'Image upload complete, Please check your php file directory';
?>

第二步创建一个IntentService来上传你的照片:

public class SendImageServer extends IntentService {

    //Local variables
    private Bitmap mBitmap;
    private int result;
    private String photoName;

      public SendImageServer() {
        super(Constants.INTENT_SERVICE_CLASS_NAME);

      }


  @Override
  protected void onHandleIntent(Intent intent) {
        try {
          String filePath = intent.getStringExtra(Constants.INTENT_SERVICE_FILE_PATH);
            java.util.UUID photoNameUUID = java.util.UUID.randomUUID();
            photoName = photoNameUUID.toString()+".png";
            BitmapFactory.Options options = null;
            options = new BitmapFactory.Options();
            options.inSampleSize = 3;
            mBitmap = BitmapFactory.decodeFile(filePath.trim(),
                    options);
            mBitmap = Bitmap.createScaledBitmap(mBitmap, Constants.WIDTH_PHOTO, Constants.HEIGHT_PHOTO, true);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            // Must compress the Image to reduce image size to make upload easy
            mBitmap.compress(Bitmap.CompressFormat.PNG, 50, stream);
            byte[] byte_arr = stream.toByteArray();
            // Encode Image to String
            String encodedString = Base64.encodeToString(byte_arr, 0);

            RequestParams params = new RequestParams();
            params.put("image", encodedString);
            params.put("filename", photoName);
            makeHTTPCall(params);


      }
        catch (Exception e){
            publishResults("", 4,0);
      }

  }

    /**
     * Make Http call to upload Image to Php server
     * @param params
     */
    public void makeHTTPCall(RequestParams params) {

        SyncHttpClient client = new SyncHttpClient();
        // Don't forget to change the IP address to your LAN address. Port no as well.
        client.post(Constants.FILE_UPLOAD_URL,
                params,new AsyncHttpResponseHandler() {
                    // When the response returned by REST has Http
                    // response code '200'
                    @Override
                    public void onSuccess(String response) {
                        result = Constants.RESULT_OK;
                        publishResults(Constants.URL_IMAGES_REPOSITORY + photoName, result, 0);

                    }

                    // When the response returned by REST has Http
                    // response code other than '200' such as '404',
                    // '500' or '403' etc
                    @Override
                    public void onFailure(int statusCode, Throwable error,
                                          String content) {

                        // When Http response code is '404'
                        if (statusCode == 404) {
                            result = Constants.RESULT_FAIL_404;

                            publishResults(Constants.EMPTY_TAG, result, statusCode);
                        }
                        // When Http response code is '500'
                        else if (statusCode == 500) {
                            result = Constants.RESULT_FAIL_500;
                            publishResults(Constants.EMPTY_TAG, result, statusCode);
                        }
                        // When Http response code other than 404, 500
                        else {
                            result = Constants.RESULT_FAIL;
                            publishResults(Constants.EMPTY_TAG, result, statusCode);
                        }
                    }
                });
    }


  private void publishResults(String mUrl, int result, int statusCode) {

      Intent intent = new Intent(Constants.NOTIFICATION);
      intent.putExtra(Constants.INTENT_SERVICE_PHOTO, mUrl);
      intent.putExtra(Constants.INTENT_SERVICE_RESULT, result);
      intent.putExtra(Constants.INTENT_SERVICE_STATUS_CODE, statusCode);
      sendBroadcast(intent);
  }
} 

第三步调用IntentService:

Intent intent = new Intent(this, SendImageServer.class);
// add info for the service which file to download and where to store
intent.putExtra(Constants.INTENT_SERVICE_FILE_PATH, mFilePath);
startService(intent);

第四步创建广播接收器以通信上传结果:

private BroadcastReceiver mReceiverPhoto = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            if(mProgDialog.isShowing())
            {
                mProgDialog.dismiss();
            }
            if (bundle != null) {
                String mUrl = bundle.getString(Constants.INTENT_SERVICE_PHOTO);
                int resultCode = bundle.getInt(Constants.INTENT_SERVICE_RESULT);
                int statusCode = bundle.getInt(Constants.INTENT_SERVICE_STATUS_CODE);
                if (resultCode == Constants.RESULT_OK) {
                    mUser.setmProfilePhoto(mUrl);
                    ((NewUserActivity) context).setPhoto(mUrl);
                }
                else if (resultCode == Constants.RESULT_FAIL_404) {
                    Toast.makeText(getApplicationContext(),
                            getString(R.string.constants_resource_not_found_error),
                            Toast.LENGTH_LONG).show();
                }
                else if (resultCode == Constants.RESULT_FAIL_500) {
                    Toast.makeText(getApplicationContext(),
                            getString(R.string.constants_server_error),
                            Toast.LENGTH_LONG).show();
                }
                else if (resultCode == Constants.RESULT_FAIL) {
                    Toast.makeText(
                            getApplicationContext(),
                            getString(R.string.constants_generic_http_error)
                                    + statusCode, Toast.LENGTH_LONG)
                            .show();
                }else {
                    Toast.makeText(NewUserActivity.this, getString(R.string.constants_download_failed),
                            Toast.LENGTH_LONG).show();
                }
            }
        }
    };

第五步注册您的BroadCast接收器:

registerReceiver(mReceiverPhoto, new IntentFilter(Constants.NOTIFICATION));

不要忘记在不再需要时取消注册。