【发布时间】:2020-09-13 10:04:24
【问题描述】:
语言:Swift 5
iOS:13.2
macOS:Catalina 10.15.4
Firebase 存储规则:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth!=null;
}
}
}
上传图片并保存下载地址的代码:(效果很好,因为我可以看到上传到存储的图片以及它们各自的下载地址存储到实时数据库。)
let storageRef = Storage.storage().reference()
//Let's upload all workout pictures
let uploadPicsRef =
storageRef.child("WORKOUTDATA/USERS/"+self.UID!).child("WHITEBOARDWORKOUTS")
let uploadNumberRef = uploadPicsRef.child("\(String(describing: workoutNum))")
let workoutPicturesRef = uploadNumberRef.child("WORKOUTPICTURES")
let workoutPicURLRef = workoutRef.child("WORKOUTPICTURESURL")
var count = 0
var picNumber = 0
//workoutPictures list/array contains images selected from iPhone Gallery, using
//UIImagePickerController
for workoutPic in self.workoutPictures
{
let workoutPicData = workoutPic.jpegData(compressionQuality: 1.0)!
count = count + 1
let pictureName = "Picture\(count).jpg"
// Upload the file to the path in pictureRef
let pictureRef = workoutPicturesRef.child("\(pictureName)")
let metaData = StorageMetadata()
metaData.contentType = "image/jpg"
pictureRef.putData(workoutPicData, metadata: metaData) { (metadata, error) in
if error != nil {
print("Error while uploading image")
}
else
{
pictureRef.downloadURL { (url, err) in
picNumber = picNumber + 1
workoutPicURLRef.child("Picture\(picNumber)").setValue(url?.absoluteString)
}
}
}
}
图片下载代码:
let myGroup = DispatchGroup()
let workoutPicUrls = snapshot.childSnapshot(forPath: "WORKOUTPICTURESURL")
for url in workoutPicUrls.children
{
myGroup.enter()
let snap = url as! DataSnapshot
let link = snap.value as? String
let storageRef = Storage.storage().reference()
let pictureRef = storageRef.root().child(link!)
DispatchQueue.main.async {
pictureRef.getData(maxSize: 1*2000000*2000000) { (data, err) in
if (err != nil) {
print(err!)
print(err!.localizedDescription)
} else {
let pic = UIImage(data: data!)
workoutPicsArray.append(pic!)
myGroup.leave()
}
}
}
}
错误:
错误域=FIRStorageErrorDomain 代码=-13010 "对象 https:/firebasestorage.googleapis.com/v0/b/trainer-8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1alYIeWPAsFC6YMoJKPFSj1%2FWHITEBOARDWORKOUTS%2F5%2FWORKOUTPICTURES%2FPicture1。 jpg?alt=media&token=785ab8c7-1e08-4ad3-a542-c9e6313eb547 不存在。” UserInfo={object=https:/firebasestorage.googleapis.com/v0/b/trainer-8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1alYIeWPAsFC6YMoJKPFSj1%2FWHITEBOARDWORKOUTS%2F5%2FWORKOUTPICTURES%2F5%2FWORKOUTPICTURES%2FPicture1.jpg?alt=media&token=785ab8c7- 1e08-4ad3-a542-c9e6313eb547,响应体={ “错误”: { “代码”:404, "message": "未找到。无法获取对象", “状态”:“GET_OBJECT” } },bucket=trainer-8cb52.appspot.com,数据={长度=115,字节=0x7b0a2020 22657272 6f72223a 207b0a20 ... 54220a20 207d0a7d},data_content_type=application/json; charset=UTF-8, NSLocalizedDescription=对象 https://firebasestorage.googleapis.com/v0/b/trainer-8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1alYIeWPAsFC6YMoJKPFSj1%2FWHITEBOARDWORKOUTS%2F5%2FWORKOUTPICTURES%2FPicture1.jpg ?alt=media&token=785ab8c7-1e08-4ad3-a542-c9e6313eb547 不存在。, ResponseErrorDomain=com.google.HTTPStatus, ResponseErrorCode=404}
到目前为止我所做的尝试:
- 已检查 Firebase 存储规则。
- 当我在 chrome 浏览器窗口中粘贴路径
https:/firebasestorage.googleapis.com/v0/b/trainer8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1alYIeWPAsFC6YMoJKPFSj1%2FWHITEBOARDWORKOUTS%2F5%2FWORKOUTPICTURES%2FPicture1.jpg?alt=media&token=785ab8c7-1e08-4ad3-a542-c9e6313eb547时,会打开预期的图像。 - 将 maxSize 设置为一个高得离谱的数字 1*2000000*2000000。
谢谢!
【问题讨论】:
-
下载 URL 完全不受安全规则的影响。错误消息是说找不到您正在使用的 URL 的图像。请注意错误中的文本“不存在”。
-
@DougStevenson 当我粘贴 URL https:/firebasestorage.googleapis.com/v0/b/trainer8cb52.appspot.com/o/WORKOUTDATA%2FUSERS%2F1K7WV1alYIeWPAsFC6YMoJKPFSj1%2FWHITEBOARDWORKOUTS%2F5%2FWORKOUTPICTURES%2FPicture1。 jpg?alt=media&token=785ab8c7-1e08-4ad3-a542-c9e6313eb547 在 chrome 浏览器窗口中,预期的图像打开。如果 URL 中不存在图像,它就不会起作用,对吧?如果我在这里想错了,请纠正我。
标签: ios swift firebase firebase-storage