Java Firebase存储-防止覆盖文件

Java Firebase存储-防止覆盖文件,java,android,firebase,android-camera,firebase-storage,Java,Android,Firebase,Android Camera,Firebase Storage,我允许用户拍照并将其存储到Firebase。下面是我的代码,其中包含加载相机应用程序、保存图像,然后上载到Firebase存储的意图。我遇到的问题是,每次后续上传到Firebase存储都会覆盖上一次上传,这意味着存储中有1个文件一直被覆盖。我想继续添加多个文件: private void createAlertDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTit

我允许用户拍照并将其存储到Firebase。下面是我的代码,其中包含加载相机应用程序、保存图像,然后上载到Firebase存储的意图。我遇到的问题是,每次后续上传到Firebase存储都会覆盖上一次上传,这意味着存储中有1个文件一直被覆盖。我想继续添加多个文件:

private void createAlertDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(R.string.add_image_dialog_title);
    builder.setItems(new CharSequence[]
                    {getResources().getString(R.string.add_image_web), getResources().getString(R.string.add_image_camera), getResources().getString(R.string.add_image_gallery)},
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // The 'which' argument contains the index position
                    // of the selected item
                    switch (which) {
                        case 0:
                            Intent toImageSearch = new Intent(CreateActivity.this, NewImageActivity.class);
                            startActivityForResult(toImageSearch, USE_WEB);
                            break;
                        case 1:
                            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                            if (takePictureIntent.resolveActivity(getApplication().getPackageManager()) != null) {
                                startActivityForResult(takePictureIntent, TAKE_PICTURE);
                            } else {
                                Toast.makeText(getApplicationContext(), getResources().getString(R.string.camera_error), Toast.LENGTH_LONG).show();
                            }
                            break;
                        case 2:
                            Toast.makeText(getApplicationContext(), "clicked 2", Toast.LENGTH_LONG).show();
                            break;
                        case 3:
                            Toast.makeText(getApplicationContext(), "clicked 3", Toast.LENGTH_LONG).show();
                            break;
                    }
                }
            }

    );
    builder.create().

            show();
}
 FirebaseStorage storage = FirebaseStorage.getInstance();
            StorageReference storageRef = storage.getReferenceFromUrl("gs://myfirebaseproject.appspot.com");
            StorageReference fileRef =
                    storageRef.child(channelId)
                    .child(String.valueOf(message.getSender()))
                    .child(String.valueOf(message.getTimestamp()));

            UploadTask uploadTask = fileRef.putFile(message.getAttachmentUri());
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    sendMessage(channelId, message.getMessageText(), taskSnapshot.getStorage().toString(), message.getAttachmentType(), callback);
                }
            });
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    callback.onError(e.toString());
                }
            }); 
OnActivityResult()

 FirebaseStorage storage = FirebaseStorage.getInstance();
            StorageReference storageRef = storage.getReferenceFromUrl("gs://myfirebaseproject.appspot.com");
            StorageReference fileRef =
                    storageRef.child(channelId)
                    .child(String.valueOf(message.getSender()))
                    .child(String.valueOf(message.getTimestamp()));

            UploadTask uploadTask = fileRef.putFile(message.getAttachmentUri());
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    sendMessage(channelId, message.getMessageText(), taskSnapshot.getStorage().toString(), message.getAttachmentType(), callback);
                }
            });
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    callback.onError(e.toString());
                }
            }); 
保存到Firebase:

 private void encodeBitmapAndSaveToFirebase(Bitmap bitmap) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] data = baos.toByteArray();

    UploadTask uploadTask = mPollImageStorage.putBytes(data);
    uploadTask.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            Toast.makeText(getApplicationContext(), "Error Loading Photo", Toast.LENGTH_LONG).show();
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
            Uri downloadUrl = taskSnapshot.getDownloadUrl();
            mAddImageButton.setVisibility(View.INVISIBLE);
            resultImageURL = downloadUrl.toString();
            Picasso.with(getApplicationContext())
                    .load(resultImageURL)
                    .into(mImagePreview);
        }
    });

}
 FirebaseStorage storage = FirebaseStorage.getInstance();
            StorageReference storageRef = storage.getReferenceFromUrl("gs://myfirebaseproject.appspot.com");
            StorageReference fileRef =
                    storageRef.child(channelId)
                    .child(String.valueOf(message.getSender()))
                    .child(String.valueOf(message.getTimestamp()));

            UploadTask uploadTask = fileRef.putFile(message.getAttachmentUri());
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    sendMessage(channelId, message.getMessageText(), taskSnapshot.getStorage().toString(), message.getAttachmentType(), callback);
                }
            });
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    callback.onError(e.toString());
                }
            }); 
private void encodebitmap和savetofirebase(位图){
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
压缩(bitmap.CompressFormat.JPEG,100,baos);
字节[]数据=baos.toByteArray();
UploadTask UploadTask=mPollImageStorage.putBytes(数据);
uploadTask.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
Toast.makeText(getApplicationContext(),“加载照片时出错”,Toast.LENGTH_LONG.show();
}
}).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
//taskSnapshot.getMetadata()包含文件元数据,如大小、内容类型和下载URL。
Uri downloadUrl=taskSnapshot.getDownloadUrl();
mAddImageButton.setVisibility(视图.不可见);
resultImageURL=downloadUrl.toString();
Picasso.with(getApplicationContext())
.load(resultImageURL)
.进入(图像预览);
}
});
}

每次上传都需要使用单独的位置或单独的文件名

 FirebaseStorage storage = FirebaseStorage.getInstance();
            StorageReference storageRef = storage.getReferenceFromUrl("gs://myfirebaseproject.appspot.com");
            StorageReference fileRef =
                    storageRef.child(channelId)
                    .child(String.valueOf(message.getSender()))
                    .child(String.valueOf(message.getTimestamp()));

            UploadTask uploadTask = fileRef.putFile(message.getAttachmentUri());
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    sendMessage(channelId, message.getMessageText(), taskSnapshot.getStorage().toString(), message.getAttachmentType(), callback);
                }
            });
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    callback.onError(e.toString());
                }
            }); 

您可以创建如下自定义位置:

 FirebaseStorage storage = FirebaseStorage.getInstance();
            StorageReference storageRef = storage.getReferenceFromUrl("gs://myfirebaseproject.appspot.com");
            StorageReference fileRef =
                    storageRef.child(channelId)
                    .child(String.valueOf(message.getSender()))
                    .child(String.valueOf(message.getTimestamp()));

            UploadTask uploadTask = fileRef.putFile(message.getAttachmentUri());
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    sendMessage(channelId, message.getMessageText(), taskSnapshot.getStorage().toString(), message.getAttachmentType(), callback);
                }
            });
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    callback.onError(e.toString());
                }
            }); 
FirebaseStorage=FirebaseStorage.getInstance();
StorageReference-storageRef=storage.getReferenceFromUrl(“gs://myfirebaseproject.appspot.com”);
StorageReference文件引用=
storageRef.child(channelId)
.child(String.valueOf(message.getSender()))
.child(String.valueOf(message.getTimestamp());
UploadTask UploadTask=fileRef.putFile(message.getAttachmentUri());
uploadTask.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
sendMessage(channelId、message.getMessageText()、taskSnapshot.getStorage().toString()、message.getAttachmentType()、回调);
}
});
uploadTask.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
callback.onError(例如toString());
}
}); 

您可以看到,我们正在将自定义位置添加到基本存储引用中,这样我们就不会覆盖现有项目。

存储图像的位置由
mPollImageStorage
引用的内容决定。如果
mPollingStorage
始终引用相同的位置,即在您的
onCreate
中,您可以执行以下操作:

 FirebaseStorage storage = FirebaseStorage.getInstance();
            StorageReference storageRef = storage.getReferenceFromUrl("gs://myfirebaseproject.appspot.com");
            StorageReference fileRef =
                    storageRef.child(channelId)
                    .child(String.valueOf(message.getSender()))
                    .child(String.valueOf(message.getTimestamp()));

            UploadTask uploadTask = fileRef.putFile(message.getAttachmentUri());
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    sendMessage(channelId, message.getMessageText(), taskSnapshot.getStorage().toString(), message.getAttachmentType(), callback);
                }
            });
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    callback.onError(e.toString());
                }
            }); 

StorageReference mPollingStorage=storageRef.child(“polling.jpg”);

 FirebaseStorage storage = FirebaseStorage.getInstance();
            StorageReference storageRef = storage.getReferenceFromUrl("gs://myfirebaseproject.appspot.com");
            StorageReference fileRef =
                    storageRef.child(channelId)
                    .child(String.valueOf(message.getSender()))
                    .child(String.valueOf(message.getTimestamp()));

            UploadTask uploadTask = fileRef.putFile(message.getAttachmentUri());
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    sendMessage(channelId, message.getMessageText(), taskSnapshot.getStorage().toString(), message.getAttachmentType(), callback);
                }
            });
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    callback.onError(e.toString());
                }
            }); 

然后它将继续覆盖camerapic.jpg。如果您不想覆盖它,可以将图像名称设置为拍摄图像的时间,或者根据stackoverflow post生成UUID:

我知道在实时数据库中有一个.push()方法来生成唯一密钥,存储是否有一个等价物?我只是在寻找类似的东西——这篇文章说要使用uuid:您可以创建这样的自定义位置:FirebaseStorage=FirebaseStorage.getInstance();StorageReference-storageRef=storage.getReferenceFromUrl(“gs://myfirebaseproject.appspot.com”);StorageReference fileRef=storageRef.child(channelId).child(String.valueOf(message.getSender()).child(String.valueOf(message.getTimestamp());您可以看到,我们正在将自定义位置添加到基本存储引用中,这样就不会覆盖现有项目。如何更改由摄像头意图生成的文件名?从何处获取channelId和消息实例?非常感谢,您能告诉我为什么我的clickListener不能正常工作?
 FirebaseStorage storage = FirebaseStorage.getInstance();
            StorageReference storageRef = storage.getReferenceFromUrl("gs://myfirebaseproject.appspot.com");
            StorageReference fileRef =
                    storageRef.child(channelId)
                    .child(String.valueOf(message.getSender()))
                    .child(String.valueOf(message.getTimestamp()));

            UploadTask uploadTask = fileRef.putFile(message.getAttachmentUri());
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    sendMessage(channelId, message.getMessageText(), taskSnapshot.getStorage().toString(), message.getAttachmentType(), callback);
                }
            });
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    callback.onError(e.toString());
                }
            });