我正在尝试从我的 Firebase 存储中下载视频。我这样做的方法是使用 .downloadURLWithCompletion
函数。当函数执行时,我收到此错误
Error Domain=FIRStorageErrorDomain Code=-13010 "Object videos/video1.m4v
does not exist." UserInfo={object=videos/video1.m4v
, bucket=**********.appspot.com, ResponseBody={
"error": {
"code": 404,
"message": "Not Found"
}
}, data=<7b0a2020 22657272 6f72223a 207b0a20 20202022 636f6465 223a2034 30342c0a 20202020 226d6573 73616765 223a2022 4e6f7420 466f756e 64220a20 207d0a7d>, NSLocalizedDescription=Object videos/video1.m4v
does not exist., ResponseErrorDomain=com.google.HTTPStatus, ResponseErrorCode=404}
我已更改 Firebase 上的存储设置以允许未经身份验证的访问:
以下是访问 Firebase 存储的代码:
import UIKit
import AVKit
import AVFoundation
import FirebaseStorage
class VideoViewController: UIViewController
{
var videoUrl:NSURL!
var storageRef:FIRStorageReference!
override func viewDidLoad()
{
let storage = FIRStorage.storage()
storageRef = storage.referenceForURL("gs://**********.appspot.com")
let videosRef = storageRef.child("videos")
let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
videosRef.child(videoName).downloadURLWithCompletion { (URL, error) -> Void in
if (error != nil)
{
print(error!)
}
else
{
self.videoUrl = URL
do
{
try self.playVideo()
}
catch
{
print("Error")
}
}
}
super.viewDidLoad()
// Do any additional setup after loading the view.
}
所以,我尝试使用直接链接,它成功了!
override func viewDidLoad()
{
let storage = FIRStorage.storage()
storageRef = "gs://*************.appspot.com"
let videosRef = "videos"
let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
storage.referenceForURL("\(storageRef)/\(videosRef)/\(videoName)").downloadURLWithCompletion { (URL, error) in
if (error != nil)
{
print(error!)
}
else
{
self.videoUrl = URL
do
{
try self.playVideo()
}
catch
{
print("Error")
}
}
}
当然,使用类似的直接链接并不是获取数据的最佳方式。接下来我比较了打印出来生成的两个链接。这是我打印第一个链接的方式:
var videoUrl:NSURL!
var storageRef:FIRStorageReference!
override func viewDidLoad()
{
let storage = FIRStorage.storage()
storageRef = storage.referenceForURL("gs://*********.appspot.com")
let videosRef = storageRef.child("videos")
let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
print(videosRef.child(videoName))
它打印了
gs://************.appspot.com/videos/video1.m4v
第二个链接:
var videoUrl:NSURL!
var storageRef:String!
override func viewDidLoad()
{
let storage = FIRStorage.storage()
storageRef = "gs://***********.appspot.com"
let videosRef = "videos"
let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
print("\(storageRef)/\(videosRef)/\(videoName)")
打印的内容
gs://************.appspot.com/videos/video1.m4v
现在,我还尝试打印 videoName
的值,以确保它是正确的,每次打印出来时都是 video1.m4v
我已将指向我的 Firebase 存储的链接存入银行,但我可以向您保证该链接完全正确。
有人可以向我解释一下为什么我会收到此错误吗?对我来说,一切似乎都已就位。
谢谢!
最佳答案
试试这个——如果引用的底层表示存在问题,这可能会有所帮助:
而不是:
videosRef.child(videoName).downloadURLWithCompletion { (URL, error) -> Void in
做:
storage.referenceForURL(String(videosRef.child(videoName))).downloadURLWithCompletion { (URL, error) -> Void in
也就是说,stringValue 的referenceForURL 执行的操作是否与直接调用不同。不应该——如果是,可能与您的 videoName 有关。也许它以斜杠结尾?您可以发布您的 videoName 的值吗?
关于ios - Firebase downloadURLWithCompletion 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37529911/