簡體   English   中英

如何將圖像上傳到現有的 MySql 數據庫?

[英]How to upload image to existing MySql database?

我正在創建一個 android 應用程序,我正在嘗試為用戶存儲個人資料圖片。 當用戶注冊時,他被記錄在表中,我在那里插入了一個多字段image ,我將為他存儲圖像。 但我想我在發送查詢時需要使用 PUT 請求方法。 我正在根據用戶 ID 上傳該圖像並驗證每個用戶在注冊時獲得的密鑰 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));

不要忘記在不再需要時取消注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM