语言:Swift 5
监督办:13.2
MacOS:Catalina 10.15.4
Firebase存储规则:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth!=null;
}
}
}
上传图像和保存下载URL的代码:(这工作很好,因为我可以看到图像上传到存储区,它们各自的下载URL存储到实时数据库。)
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%2fworkoutpicts%2fpicture1.jpg?alt=介质&标记=785ab8c7-1e08-4ad3-a542-c9e6313eb547不存在。”userinfo={object=https:/firebaseStorage.googleapis.com/v0/b/trainer-8cb52.appspot.com/o/workoutdata%2fusers%2f1k7wv1alyiewpasfc6ymojkpfsj1%2fwhiteboardworkouts%2f5%2fworkoutpicts%2fpicture1.jpg?alt=介质&标记=785ab8c7-1e08-4ad3-a542-c9e6313eb547,responsebody={“错误”:{“代码”:404,“消息”:“找不到.
到目前为止我所尝试的:
https://firebasestorage.googleapis.com/v0/b/trainer8cb52.appspot.com/o/workoutdata%2fusers%2f1k7wv1alyiewpasfc6ymojkpfsj1%2fwhiteboardworkouts%2f5%2fworkoutpicts%2fpicture1.jpg?alt=media&token=785ab8c7-1e08-4ad3-a542-c9e6313eb547
时,将打开预期的图像。谢谢!
您是否可能将完整的https URL存储在数据库中,并试图通过将完整的https URL作为子级添加到存储引用中来创建引用?
我认为您应该尝试在数据库中存储路径和名称,或者更改下载代码以使用https URL。
// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
let httpsReference = storage.reference(forURL: "https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg")
httpsReference.getData(maxSize: ...
此外,您还在dispatchqueue.main.async
中运行getData方法。getData本身有一个完成处理程序,可能需要一些时间,当您在DispatchQueue.main.async
中运行该处理程序时,它将阻塞您的代码,直到下载完成。仅将更新UI的代码放在dispatchqueue.main.async
中。在您的情况下,只要您对workoutPicsArray或UIImage执行某些操作以更新视图,就可以立即执行。
看一下这里,看看你是否能弄清楚你实际上是如何尝试获取数据的。在每一行后面加上一个print()可能会有帮助,以查看您在什么地方创建和使用了什么内容。
在iOS上下载文件
我已经尝试了StackOverflow上发布的所有解决方案,但我的问题没有在那里讨论,所以我提出了这个问题。在我的例子中,图像被上传到firebase存储桶中,但没有在firestore中插入新记录,因此发生了此错误。我的代码:- 存储数据函数如下所示:-
我想在firebase存储中上载图像。我知道如何使用Uri在firebase中上传图像。但是有没有一种方法可以让我使用链接将图像上传到firebase? 我在我的项目中使用了一个API,我每月只能点击1000次,所以我试图在firebase中保存从API获取的图像。API提供了一个指向图像的链接,我使用它在Picasso的imageview中显示图像。 假设我的链接是http://xxx.xx.x
我试图用Java从Firebase存储下载一个图像到android studio应用程序的imageView中。我已经浏览了stackoverflow超过6个小时,所以我很可能读到了任何“类似”的问题。我已经尝试了各种方法,但最多的建议和似乎是最简单的是使用滑翔。我无法让它工作,也找不到错误。我甚至在一个普通的谷歌图片链接尝试,它仍然显示空白。 我用过的代码 我也试过这个代码 而这个代码 给出lo
以下是我的上传代码: 编辑:我将base64字符串复制到一个在线转换器中,看起来不错,它返回了正确的图像。看起来,数据没有问题。firebase的处理方式有问题。 编辑:我尝试显式地将类型设置为image/jpeg而不是image/jpg,如下所述:当Firestorage关闭时显示图像的正确方式,或者在Firestorage for iOS中加载预览时出错,但没有区别。
我有一个按钮,它向用户提供选择,他是否想要从画廊或相机的图像。当用户从图库拍摄图像时,我能够成功地将图像上传到Firebase存储,但是当用户选择相机时,我无法将图像上传到存储。这是用户选择相机时的onActivityResult代码 它将图像上传到我的imageview,但给我错误提示 当我尝试上载到存储时 我在stack overflow上遇到了一个类似的问题。 我认为公认的答案是错误的,因为