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

标签 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 请求时我的 url 的外观。http://localhost:8081/timster/v1/image/2 .最后一个数字是我要上传新图像的用户的 ID。

最佳答案

这是我之前开发的一些代码,用于将图像上传到 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();
                }
            }
        }
    };

第五步注册您的广播接收器:
registerReceiver(mReceiverPhoto, new IntentFilter(Constants.NOTIFICATION));

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

关于php - 如何将图像上传到现有的 MySql 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36354771/

相关文章:

php - Facebook PHP SDK : $facebook->getUser() sometimes returning 0

接受格式的 PHP strtotime() 函数?

mysql - 在 rundeck-config.properties 文件中配置 mysql 时,Rundeck 停止运行并抛出 'http error 503'

php - MYSQL PHP 将 ID 数组与表进行比较并按顺序返回新数组

php - 找出正则表达式的文件分隔符

Phpunit:在功能测试中的类中添加方法

php - 在Dockerfile中安装使用OpenSSL和zlib编译的cURL

java - 无法启动接收器 nullpointerException

android - 当多个 Activity 收到时如何区分 Intent

android - E/com.facebook.appevents.RestrictiveDataManager : updateRulesFromSetting failed