Как получить URL-адрес файла после загрузки в Firebase?
После того, как вы загрузили файл в Firebase, как вы можете получить его URL, чтобы вы могли сохранить его для дальнейшего использования? Я хочу записать URL в базу данных Firebase, чтобы другие пользователи могли получить доступ к изображению.
Я загружаю файл так:
public void uploadFile()
{
StorageReference filepath = mstorageRef.child("folder").child(filename);
Uri File= Uri.fromFile(new File(mFileName));
filepath.putFile(File).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot)
{
Toast.makeText(MtActivity.this, "Upload Done", Toast.LENGTH_LONG).show();
}
});
}
Я подтвердил, что файлы на самом деле загружаются, поэтому теперь мне просто нужен URL, который я могу записать в свою базу данных. Однако, когда я попытался сделать это:
Uri downloadUrl = taskSnapshot.getMetadata().getDownloadUrl();
Это дает мне ошибку и говорит, что This method should only be accessed from tests or within private scope
Я не уверен, что это значит, и я также не знаю, почему я получу эту ошибку, так как я следую этому примеру, предоставленному Firebase.
Есть ли новый способ получения URL?
Кроме того, является ли этот URL уникальным для этого элемента в частности? То есть, если я сохраню его в базе данных и попытаюсь получить к нему доступ позже, смогу ли я это сделать?
Ответы
Ответ 1
Вы используете UploadTask.getDownloadUrl()
который устарел. Вы можете использовать StorageReference.getDownloadUrl().
В вашем случае вы можете попробовать это как -
filepath.putFile(File).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot)
{
filepath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Uri downloadUrl = uri;
//Do what you want with the url
}
Toast.makeText(MtActivity.this, "Upload Done", Toast.LENGTH_LONG).show();
}
});
Позаботьтесь о том, чтобы StorageReference.getDownloadUrl()
возвращал Task, который должен обрабатываться асинхронно, вы не можете выполнить Uri downloadUrl = photoRef.getDownloadUrl().getResult();
иначе вы получите java.lang.IllegalStateException: Task is not yet complete
Ответ 2
Этот метод тоже работает и немного проще.
Это не что-то "невероятное", но оно сокращает ваш код до нескольких строк. Надеюсь, что это полезный ответ.
StorageReference filepath = mstorageRef.child("folder").child(filename);
filepath.putFile(File).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot){
Uri downloadUrl = filepath.getDownloadUrl(); // here is Url for photo
Toast.makeText(MtActivity.this, "Upload Done", Toast.LENGTH_LONG).show();
}
});
Ответ 3
Вот жарко я это сделал
1) Это мой Загрузить и получить код http URL:
UploadTask uploadTask = FirebaseStorage.getInstance().getReference().child("id").child("filename")
.putFile(uri);
Task<Uri> urlTask = uploadTask.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();
}
// Continue with the task to get the download URL
return FirebaseStorage.getInstance().getReference().child(user.getUid()).child(avatarName).getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
FirebaseDatabase.getInstance().getReference().child(user.getUid())
.child(avatarName)
.child("avatar_image")
.setValue(downloadUri.toString());
Toast.makeText(getContext(), "Success", Toast.LENGTH_SHORT).show();
} else {
// Handle failures
// ...
Toast.makeText(getContext(), "Failed", Toast.LENGTH_SHORT).show();
}
}
});
2) Это мой код onActivityResult после получения изображения из галереи
@Override
public 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) {
uri = data.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), uri);
// Log.d(TAG, String.valueOf(bitmap));
ivAvatarPic.setImageBitmap(bitmap);
//ImageView imageView = (ImageView) findViewById(R.id.imageView);
//imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ответ 4
Как уже упоминалось выше, StorageReference.getDownloadUrl()
возвращает Task.
Вот мой код:
filepath.putFile(imageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if(task.isSuccessful()){
filepath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Uri downloadUri = uri;
String download_url = uri.toString();
mUserDatabase.child("image").setValue(download_url).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()) {
mProgressDialog.dismiss();
Toast.makeText(SettingActivity.this, "Successfully uploaded", Toast.LENGTH_LONG).show();
}else {
Toast.makeText(SettingActivity.this, "Error happened during the upload process", Toast.LENGTH_LONG).show();
}
}
});
}
});
}else{
Toast.makeText(SettingActivity.this, "Error happened during the upload process", Toast.LENGTH_LONG ).show();
}
}
});
Ответ 5
Попробуй это:
filepath.putFile(File).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if(task.isSuccessful()){
String fileUri = task.getResult().getUploadSessionUri().toString();
// Do whatever you want with fileUri
}
}
}) ;
Ответ 6
Используйте следующий код
val imageGalleryRef = storageReference?.child(name + "_gallery")
val uploadTask = imageGalleryRef.putFile(file)
uploadTask.addOnFailureListener({ e ->
Log.e(TAG, "onFailure sendFileFirebase " + e.message)
}).addOnCompleteListener(
object : OnCompleteListener<UploadTask.TaskSnapshot> {
override fun onComplete(p0: Task<UploadTask.TaskSnapshot>) {
imageGalleryRef.downloadUrl.addOnSuccessListener { e ->
run {
downloadUrl = e.toString() // e is image download Uri
}
}
}
}
)
Ответ 7
final StorageReference riversRef = mStoreage.child(CommonUtils.getDatetime()); final UploadTask uploadTask = riversRef.putFile(imageUri); uploadTask.addOnSuccessListener(new OnSuccessListener() {@Override public void onSuccess (UploadTask.TaskSnapshot taskSnapshot) {progressDialog.dismiss();//selected_image.setVisibility(View.GONE); riversRef.getDctivity) new OnSuccessListener() {@Override public void onSuccess (Uri uri) {Toast.makeText(getApplicationContext(), uri.toString(), Toast.LENGTH_LONG).show(); String caption = content.getText(). toString(); FeedData feedData = FeedData.builder(). Caption (caption).imageUrl(uri.toString()). PackageName (packagename).appName(appname).build(); feedpost (feedData);}});
Toast.makeText(getApplicationContext(), "upload complete", Toast.LENGTH_LONG).show();
Snackbar snackbar = Snackbar.make(getActivity().findViewById(android.R.id.content), "upload complete", Snackbar.LENGTH_INDEFINITE);
snackbar.show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
progressDialog.dismiss();
Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_LONG).show();
}
})
Ответ 8
filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
String category = spinner.getSelectedItem().toString();
String title = ((EditText) findViewById(R.id.post_title)).getText().toString();
String description = ((EditText) findViewById(R.id.post_description)).getText().toString();
final Post post = new Post(userId, category, title, description, latitude, longitude, true);
post.setAddressList(addressLine);
post.setContact(contact);
if (addressLine != null) {
post.setPlace(addressLine.split(",")[2]);
}
post.setId(key);
post.setImage(uri.toString());
databaseReference.setValue(post).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
((EditText) findViewById(R.id.post_title)).setText("");
((EditText) findViewById(R.id.post_description)).setText("");
postImageButton.setImageURI(null);
progressBarDialog.dismiss();
Toast.makeText(PostActivity.this, "Your request is sucessfully completed", Toast.LENGTH_SHORT).show();
} else if (!task.isSuccessful()) {
progressBarDialog.dismiss();
Toast.makeText(PostActivity.this, "Your request is not completed", Toast.LENGTH_SHORT).show();
}
}
});
}
});
}
Ответ 9
Вы попробовали taskSnapshot.getDownloadUrl()
?
если это также не сработает, вы можете получить местоположение изображения в приемнике успеха mstorageRef.child("folder").child(filename).toString()
Ответ 10
Попробуйте следующее:
final Uri uri = data.getData();
StorageReference filepath = mStorageRef.child("folder").child(filename);
filepath.putFile(uri).addOnSuccessListener(new
OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Uri downloadUri = taskSnapshot.getDownloadUrl();
//Getting url where image is stored
//downloadUri will store image URI
}
});