Firebase存储 - 限制用户上传到Firebase存储的图像大小

16

我是一名新的Firebase开发者。我正在开发一个安卓应用程序,允许用户将图片上传到Firebase存储。由于我使用了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存储中限制文件大小。请查看此网站此视频的第二部分。 - André Kool
3个回答

38
根据Firebase Storage安全规则文档,您可以编写规则来检查上传文件的大小:
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的图像,会发生什么?它会压缩还是拒绝? - Anbarasu Chinna
如果您想要更小的图像,可以压缩客户端,或者设置一个具有更高大小限制的“放置区”,并触发云函数来调整图像大小。否则,它将被拒绝。 - Mike McDonald

8

使用JS在客户端进行调整大小

如果您的目的不是限制用户,而是保持图像的尺寸较小,您可以使用JavaScript在客户端上调整图像大小。

这对我们来说是完美的解决方案,可以节省以下内容:

  1. 我们的主机空间,
  2. 该主机空间的费用,
  3. 上传时访问者的时间(通常少于10倍),
  4. 移动设备上传时访问者的流量费用,
  5. 访问者在使用其他解决方案时上传大型照片时遇到的问题和不良体验。

如果您有兴趣,可以查看dcollien的另一个答案,在那里我们基于调整大小:

https://dev59.com/mHE95IYBdhLWcg3wJKl_#31669706

如可以在此答案中看到,使用方法非常简单,只需包含一个JS / ES6文件即可。

我认为这个人(dcollien)应该得到更多的功劳,因此建议您投票支持他的答案和这个答案(以便其他人可以找到它)。


2023年更新

前一个推荐脚本的作者现在推荐使用这个脚本: https://github.com/nodeca/pica

可以在此处进行测试: http://nodeca.github.io/pica/demo/

注意:我尚未在我的代码中测试过它,但应该更好(另一个有故障)。


2
那个链接真的值得一枚奖章。 - johnozbay

0

可能有点晚了,但可以帮助其他新手 :-) 您可以使用以下方式使用字节来减小上传的大小:

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接