android - 之前上传的图像被 FireBase Storage Android 中的新图像删除
问题描述
好的,所以当我第一次上传图像时它很好,但是在上传第二张图像后,前一张会从存储中删除。我喜欢我用来上传图片的代码。
我已经链接了负责将文件上传到 Firebase 存储的整个活动类。试图为图像提供不同的名称(uid)但无济于事。
import android.content.Intent;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.Continuation;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.StorageTask;
import com.google.firebase.storage.UploadTask;
import com.squareup.picasso.Picasso;
import java.util.UUID;
public class ActivityUltimateMemeWorks extends AppCompatActivity {
private static final int PICK_IMAGE_REQUEST = 1;
private Button mButtonChooseImage;
private Button mButtonUpload;
private TextView mTextViewShowUploads;
private EditText mEditTextFileName;
private ImageView mImageView;
private ProgressBar mProgressBar;
private StorageReference mStorageRef;
private DatabaseReference mDatabaseRef;
private StorageTask mUploadTask;
private String imageIdentifier;
private Uri mImageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ultimate_meme_works);
mButtonChooseImage = findViewById(R.id.button_choose_image);
mButtonUpload = findViewById(R.id.button_upload);
mTextViewShowUploads = findViewById(R.id.text_view_show_uploads);
mEditTextFileName = findViewById(R.id.edit_text_file_name);
imageIdentifier = UUID.randomUUID().toString() + ".png";
mImageView = findViewById(R.id.image_view);
mProgressBar = findViewById(R.id.progress_bar);
mStorageRef = FirebaseStorage.getInstance().getReference("UMWuploads").child("images").child(imageIdentifier);
mDatabaseRef = FirebaseDatabase.getInstance().getReference("UMWuploads");
mButtonChooseImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openFileChooser();
}
});
mButtonUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mUploadTask != null && mUploadTask.isInProgress()) {
Toast.makeText(ActivityUltimateMemeWorks.this, "Upload in progress", Toast.LENGTH_SHORT).show();
} else {
uploadFile();
}
}
});
mTextViewShowUploads.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openImagesActivity();
}
});
}
private void openFileChooser() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, PICK_IMAGE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
&& data != null && data.getData() != null) {
mImageUri = data.getData();
Picasso.get().load(mImageUri).into(mImageView);
}
}
private void uploadFile() {
if (mImageUri != null) {
mStorageRef.putFile(mImageUri).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful()) {
throw task.getException();
}
return mStorageRef.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
Toast.makeText(ActivityUltimateMemeWorks.this, "uploading", Toast.LENGTH_SHORT).show();
Log.e("hello", "then: " + downloadUri.toString());
Upload upload = new Upload(mEditTextFileName.getText().toString().trim(),
downloadUri.toString());
mDatabaseRef.push().setValue(upload);
} else {
Toast.makeText(ActivityUltimateMemeWorks.this, "upload failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
}
}
private void openImagesActivity() {
Intent intent = new Intent(this, ImagesActivity.class);
startActivity(intent);
}
}
解决方案
试试这个,每次上传都会改变文件名:
private void uploadFile() {
imageIdentifier = UUID.randomUUID().toString() + ".png";
mStorageRef = FirebaseStorage.getInstance().getReference("UMWuploads").child("images").child(imageIdentifier);
if (mImageUri != null) {
mStorageRef.putFile(mImageUri).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful()) {
throw task.getException();
}
return mStorageRef.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
Toast.makeText(ActivityUltimateMemeWorks.this, "uploading", Toast.LENGTH_SHORT).show();
Log.e("hello", "then: " + downloadUri.toString());
Upload upload = new Upload(mEditTextFileName.getText().toString().trim(),
downloadUri.toString());
mDatabaseRef.push().setValue(upload);
} else {
Toast.makeText(ActivityUltimateMemeWorks.this, "upload failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
}
}
现在让我解释一下为什么它不适合你。如果您看到您分配的代码imageIdentifier
意味着onCreateView
它只会在用户启动您的应用程序时重新加载,而不是在他尝试上传图像时一直重新加载。因此,当他单击按钮或调用函数时,您需要重置图像的名称。所以只要把它放在函数里面就意味着当他点击上传时。将调用函数并调用值并返回新值。
推荐阅读
- c - C - 如何检查指针是否已从另一个指针中释放?
- regex - 字符 0:预期的字符集
- javascript - 点击关闭关闭?
- r - 如何编写循环时间序列的 r 代码?
- sql-server - FireDAC 查询将 SQL 语句中的特殊字符删除到 SQL Server
- python - 如何通过xarray中的坐标组合二维平铺数据集
- java - 在 Java 中对 int[] 原始数组进行排序的优化且高效的方法
- excel - 当表格随时间变化时如何按名称引用 Excel 表格列
- r-markdown - CJK 短标题导致 Papaja RMarkdown 出现错误
- php - 更改密码功能在 Laravel 6 中不起作用