Firebase SignedURL 不等于下载 url 存储
Firebase SignedURL not equal to download url Storage
我之前问过一个从 Firebase 存储下载URL 的问题,给我的答案是:
bucket.file(filename).getSignedUrl({
action: 'read',
expires: '03-17-2025'
}, function(err, url) {
if (err) {
console.error(err);
return;
}
// The file is now available to read from this URL.
request(url, function(err, resp) {
// resp.statusCode = 200
});
});
当我使用它通过 Glide 下载图像或使用 ExoPlayer 重新制作音频或视频文件时,前面的代码给出的代码不起作用。
然而,当上传文件时,我得到的 URL 与 Firebase 存储(它确实适用于 Glide 和 ExoPlayer)给出的完全不同:
我怎样才能像在服务器端使用 Android 或 iOS SDK 那样获得正确的 downloadUrl?
我希望你只通过应用程序上传图片吗?上传后,您将取回下载 link。我希望这能帮助你。
import com.google.firebase.storage.StorageTask;
final StorageTask uploadTask = uplodedFileRef.putBytes(data);
Log.d(TAG, "uploadFilefromPath: " + uplodedFileRef.getPath().toString());
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
Toast.makeText(acty, "Upload Failed", Toast.LENGTH_SHORT).show();
dialog.dismiss();
sendResult(false, Uri.EMPTY);
}
})
.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.
Toast.makeText(acty, "Upload Successful", Toast.LENGTH_SHORT).show();
dialog.dismiss();
sendResult(true, taskSnapshot.getDownloadUrl());
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
int bytesTransferred = (int) taskSnapshot.getBytesTransferred();
int totalBytes = (int) taskSnapshot.getTotalByteCount();
int progress = (100 * bytesTransferred) / totalBytes;
Log.v(TAG, "Bytes transferred: " + taskSnapshot.getBytesTransferred());
Log.v(TAG, "TotalBytes: " + totalBytes);
Log.v(TAG, "Upload is: " + progress + "% done");
dialog.setContent("Upload in Progress");
dialog.getProgressBar().setIndeterminate(false);
// double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
dialog.getProgressBar().setMax(totalBytes / 1024);
dialog.setMaxProgress(totalBytes / 1024);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
dialog.getProgressBar().setProgress(bytesTransferred / 1024, true);
dialog.setProgress(bytesTransferred / 1024);
} else
dialog.getProgressBar().setProgress(bytesTransferred / 1024);
dialog.setProgress(bytesTransferred / 1024);
// dialog.getProgressBar().setProgress((int) progress);
}
});
addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { //success
sendResult(true, taskSnapshot.getDownloadUrl());
}
})
在此 taskSnapshot.getDownloadUrl()
中,您将收到下载 url 然后将其保存在 firebase 数据库中,您可以在
时检索
无法像使用 Android、iOS 或 Javascript SDK 那样在服务器端下载 url。您必须通过调用 getSignedUrl() 来生成 url。
您可能想检查您是否有权在给定 URL 处读取文件。
默认情况下,您必须经过身份验证。
在 firebase 控制台中检查您的存储规则
https://firebase.google.com/docs/storage/security/#authorization
我之前问过一个从 Firebase 存储下载URL 的问题,给我的答案是:
bucket.file(filename).getSignedUrl({
action: 'read',
expires: '03-17-2025'
}, function(err, url) {
if (err) {
console.error(err);
return;
}
// The file is now available to read from this URL.
request(url, function(err, resp) {
// resp.statusCode = 200
});
});
当我使用它通过 Glide 下载图像或使用 ExoPlayer 重新制作音频或视频文件时,前面的代码给出的代码不起作用。
然而,当上传文件时,我得到的 URL 与 Firebase 存储(它确实适用于 Glide 和 ExoPlayer)给出的完全不同:
我怎样才能像在服务器端使用 Android 或 iOS SDK 那样获得正确的 downloadUrl?
我希望你只通过应用程序上传图片吗?上传后,您将取回下载 link。我希望这能帮助你。
import com.google.firebase.storage.StorageTask;
final StorageTask uploadTask = uplodedFileRef.putBytes(data);
Log.d(TAG, "uploadFilefromPath: " + uplodedFileRef.getPath().toString());
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
Toast.makeText(acty, "Upload Failed", Toast.LENGTH_SHORT).show();
dialog.dismiss();
sendResult(false, Uri.EMPTY);
}
})
.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.
Toast.makeText(acty, "Upload Successful", Toast.LENGTH_SHORT).show();
dialog.dismiss();
sendResult(true, taskSnapshot.getDownloadUrl());
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
int bytesTransferred = (int) taskSnapshot.getBytesTransferred();
int totalBytes = (int) taskSnapshot.getTotalByteCount();
int progress = (100 * bytesTransferred) / totalBytes;
Log.v(TAG, "Bytes transferred: " + taskSnapshot.getBytesTransferred());
Log.v(TAG, "TotalBytes: " + totalBytes);
Log.v(TAG, "Upload is: " + progress + "% done");
dialog.setContent("Upload in Progress");
dialog.getProgressBar().setIndeterminate(false);
// double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
dialog.getProgressBar().setMax(totalBytes / 1024);
dialog.setMaxProgress(totalBytes / 1024);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
dialog.getProgressBar().setProgress(bytesTransferred / 1024, true);
dialog.setProgress(bytesTransferred / 1024);
} else
dialog.getProgressBar().setProgress(bytesTransferred / 1024);
dialog.setProgress(bytesTransferred / 1024);
// dialog.getProgressBar().setProgress((int) progress);
}
});
addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { //success
sendResult(true, taskSnapshot.getDownloadUrl());
}
})
在此 taskSnapshot.getDownloadUrl()
中,您将收到下载 url 然后将其保存在 firebase 数据库中,您可以在
无法像使用 Android、iOS 或 Javascript SDK 那样在服务器端下载 url。您必须通过调用 getSignedUrl() 来生成 url。
您可能想检查您是否有权在给定 URL 处读取文件。
默认情况下,您必须经过身份验证。
在 firebase 控制台中检查您的存储规则
https://firebase.google.com/docs/storage/security/#authorization