【问题标题】:Firebase storage - Limit size of image that users upload to firebase storageFirebase 存储 - 限制用户上传到 Firebase 存储的图像大小
【发布时间】:2016-11-18 15:28:57
【问题描述】:

我是一名新的 Firebase 开发人员。我正在开发一个允许用户将图像上传到 Firebase 存储的 android 应用程序。因为我使用的是 Spark 模式,所以我只有 5Gb 的存储空间。 我想限制用户上传到 Firebase 存储的图像大小。 下面是我用来将图像上传到 Firebase 存储的代码。

Uri imageUri = Uri.parse(imagePath);
                    //need permistion android.permission.MANAGE_DOCUMENTS to upload file.
                    final StorageReference photoRef = mStorageRef.child(Constants.FIREBASE_LOCATION_IMAGE_EXAM).child(imageUri.getLastPathSegment());
                    taskStarted();
                    photoRef.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            Log.d(TAG, "upload success");
                            mUploadExamTaskCount--;
                            examURLArray.add(new ExamPage(taskSnapshot.getDownloadUrl().toString()));
                            if (mUploadExamTaskCount == 0) {//upload files success.
                                /**
                                 * update image link to database.
                                 */
                                DatabaseReference firebaseExamPage = FirebaseDatabase.getInstance().getReference(Constants.FIREBASE_LOCATION_EXAM_PAGE);
                                firebaseExamPage.child(examKey).setValue(examURLArray);
                                Log.d(TAG, "send upload  exam success br");
                                Intent taskCompletedIntent = new Intent(ACTION_UPLOAD_EXAM_COMPLETED);
                                LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(taskCompletedIntent);
                            }
                            taskCompleted();
                        }
                    })

你知道如何解决这个问题吗?

【问题讨论】:

  • 您可以使用安全规则限制 Firebase 存储本身的文件大小。查看this sitethis video 的第二部分

标签: firebase firebase-storage


【解决方案1】:

根据Firebase Storage Security Rules docs,您可以编写规则来检查上传文件的大小:

service firebase.storage {
  match /b/<bucket>/o {
    match /files/{fileName} {
      allow read;
      allow write: if request.resource.size < 10 * 1024 * 1024; // 10MB limit for instance
    }
  }
}

【讨论】:

  • 会发生什么,如果我尝试上传大小超过 10Mb 的图像,它会压缩还是拒绝?
  • 会被拒绝。如果您想要更小的图像(或者有一个具有更高尺寸限制并触发云功能调整图像大小的“拖放区”),请压缩客户端。
【解决方案2】:

使用 JS 在客户端调整大小

如果您的目标不一定是限制用户,而是要保持图像尺寸较小,您最好使用 JavaScript 在客户端调整图像大小

这对我们来说是完美的解决方案,节省:

  1. 我们的托管空间,
  2. 该托管空间的钱,
  3. 上传期间访问者的时间(通常少 10 倍以上),
  4. 通过移动有限带宽上传时访问者的钱,
  5. 在尝试上传大照片时给访问者带来的问题和不好的体验,我们会用其他解决方案限制

如果您有兴趣,可以关注 dcollien 的另一个答案,我们基于此调整大小:

https://stackoverflow.com/a/31669706/1920145

从那个答案中可以看出,使用方法非常简单,包含的脚本只是一个小的 JS / ES6 文件。

我相信这个人 (dcollien) 值得更多的优点,所以我建议你投票给他的答案和这个答案(这样其他人可以发现它是相关的)。

【讨论】:

  • 这个链接真的值得一枚奖牌。
【解决方案3】:

可能会迟到,但可以帮助另一个新手 :-) 您可以通过这种方式使用字节减少上传的大小:

StorageReference fileToUpload = mStorage.child("xyz").child(x);
                        ByteArrayOutputStream bao = new ByteArrayOutputStream();
                        photo.invalidate();
                        BitmapDrawable drawable = (BitmapDrawable) photo.getDrawable();
                        Bitmap  imp = drawable.getBitmap();
                        imp.compress(Bitmap.CompressFormat.JPEG, 25, bao);
                        byte[] byteArray = bao.toByteArray();
                        UploadTask uploadTask = fileToUpload.putBytes(byteArray);

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 2021-08-19
    • 2017-02-19
    • 2022-08-18
    • 2017-09-25
    • 2023-04-04
    相关资源
    最近更新 更多