Firebaseにファイルをアップロードしたら、後で使用するために保存できるように、どのようにURLを取得できますか?他のユーザーが画像にアクセスできるように、FirebaseデータベースにURLを書き込みたいです。
私は次のようにファイルをアップロードしています:
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は特にそのアイテムに固有ですか?データベースに保存して後でアクセスしようとしても意味はありますか?
非推奨のUploadTask.getDownloadUrl()
を使用しています。 StorageReference.getDownloadUrl() を使用できます。
あなたの場合、 this as-を試すことができます
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を返すことに注意してください。Taskは非同期で処理する必要があり、Uri downloadUrl = photoRef.getDownloadUrl().getResult();
を実行することはできません。そうでない場合はJava.lang.IllegalStateException: Task is not yet complete
を取得します
この方法も機能し、少し簡単です。
「信じられない」ものではありませんが、コードを数行に減らします。それが役立つ答えであることを願っています。
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();
}
});
すでに上で述べたように、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();
}
}
});
これは私がやったホットです
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();
}
}
}
これを試してください:
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
}
}
}) ;
次のコードを使用
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
}
}
}
}
)