将 base64 图像从 Android 发布到 Azure 移动后端

Posting base64 Image from Android to Azure Mobile Backend

我正在尝试将照片从我的 Android 客户端上传到我的移动后端,方法是对图像进行 base64 编码并通过我的客户端应用程序的 POST 正文发送。照片没有上传到服务器。

我后端的方法:

        [HttpPost]
        [Route("api/addactivity")]
        public IHttpActionResult AddNewMediaActivity([FromBody]string base64String, string caption, string email, string type)
        {
            byte[] f = Convert.FromBase64String(base64String);
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
            CloudConfigurationManager.GetSetting("StorageConnectionString"));

            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            // Retrieve a reference to a container. 

            CloudBlobContainer container = blobClient.GetContainerReference("photos");

            // Create the container if it doesn't already exist.
            container.CreateIfNotExists();

            container.SetPermissions(
             new BlobContainerPermissions
             {
                 PublicAccess = BlobContainerPublicAccessType.Blob
             });


            string uniqueBlobName = string.Format("photos" + "/" + "photos"+ "_{0}{1}", new Random().Next(1, 999999), new Random().Next(1, 999999));

            // Retrieve reference to a blob named "myblob".
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(uniqueBlobName);

            using (MemoryStream stream = new MemoryStream(f))
            {
                blockBlob.UploadFromStream(stream);
            }
}

我的Android代码:

BitmapFactory.Options options = new BitmapFactory.Options();
final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                        options);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
encodedImage = Base64.encodeToString(b, Base64.URL_SAFE);

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://mymobilewebaddress.azure-mobile.net/api/addactivity");

      try {
            // Request parameters and other properties.
            List<NameValuePair> params = new ArrayList<NameValuePair>(2);
            params.add(new BasicNameValuePair("Content-Type", "application/json"));
            params.add(new BasicNameValuePair("ACCEPT", "application/json"));
            params.add(new BasicNameValuePair("X-ZUMO-APPLICATION", mobileServiceAppId));
            params.add(new BasicNameValuePair("base64String",image));
            params.add(new BasicNameValuePair("caption",caption));
            params.add(new BasicNameValuePair("email",email));
            params.add(new BasicNameValuePair("type",type));
            httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

            //Execute and get the response.
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                InputStream instream = entity.getContent();
                try {
                    // do something useful
                } finally {
                    instream.close();
                }
            }
        }
        catch(Exception e)
        {

        }

但是,这不会将照片上传到我的后端。也没有错误。照片根本无法进入后端。

我是否通过 POST 正确发送了 base64 字符串? 伙计们,我做错了什么?

正在将图片上传到 BLOB 存储。搜索了几个小时后我得到了它。看看:-

上传照片图像是一个多步骤过程:

首先拍张照片,然后将 TodoItem 行插入 SQL 数据库,其中包含 Azure 存储使用的新元数据字段。新的移动服务 SQL 插入脚本向 Azure 存储请求共享访问签名 (SAS)。该脚本 returns SAS 和 blob 的 URI 到客户端。客户端使用 SAS 和 blob URI 上传照片。

那么什么是 SAS?

将上传数据到客户端应用程序中的 Azure 存储服务所需的凭据存储起来是不安全的。相反,您将这些凭据存储在您的移动服务中,并使用它们生成共享访问签名 (SAS),以授予上传新图像的权限。 SAS 是一个有效期为 5 分钟的凭证,由移动服务安全地返回给客户端应用程序。该应用程序然后使用此临时凭据上传图像。

进一步查询和详细分析。访问此官方文档 https://azure.microsoft.com/en-us/documentation/articles/mobile-services-android-upload-data-blob-storage/