Ios Firebase downloadURLWithCompletion错误
我正在尝试从firebase存储中下载视频。我这样做的方式是使用Ios Firebase downloadURLWithCompletion错误,ios,swift,firebase,firebase-storage,Ios,Swift,Firebase,Firebase Storage,我正在尝试从firebase存储中下载视频。我这样做的方式是使用.downloadURLWithCompletion函数。每当函数执行时,我都会收到此错误 Error Domain=FIRStorageErrorDomain Code=-13010 "Object videos/video1.m4v does not exist." UserInfo={object=videos/video1.m4v , bucket=**********.appspo
.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}
所以,我试着使用直接链接,它成功了
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存储的链接存入银行,但我可以向您保证,该链接在各个方面都是正确的
有人能解释一下我为什么会犯这个错误吗?在我看来,一切都准备就绪
谢谢 试试这个——如果ref的底层表示存在问题,这可能会有所帮助:
而不是:
videosRef.child(videoName).downloadURLWithCompletion { (URL, error) -> Void in
做:
也就是说,stringValue的referenceForURL是否执行与直接调用不同的操作。不应该,如果是的话,可能和你的视频名有关。也许以斜线结尾?你能发布你的videoName的值吗?那么,如果我理解正确,你想在不传递完整URL路径的情况下下载图像吗 如果是这样,我认为
downloadURLWithCompletion
需要完整的URL路径
我无法对此进行测试,因为我没有这样设置数据(我只是将firebase存储中媒体文件的完整URL存储到我的firebase数据库中),但请尝试以下操作:
videosRef.child(videoName).dataWithMaxSize(INT64_MAX, completion: { (data, error) in
if let error = error {
print("Error downloading: \(error)")
return
}
cell.imageView?.image = UIImage.init(data: data!)
})
在firebase存储中,您没有将视频文件放在名为“视频”的文件夹中 尽管如此,您还是尝试访问不存在的…/视频文件名。尝试从:gs://***************.appspot.com/videos/video1.m4v中删除/视频 或 在firebase存储中创建名为videos的文件夹,然后在其中添加同名视频(因为您无法将文件拖放到其他文件夹中),或者删除: let videosRef=“视频” 从你的道路
希望能有帮助。我觉得一切都很正确——这就是为什么我感到困惑的原因。404意味着找不到对象,这意味着bucket是错误的(因为它被屏蔽了,我看不出它们是否匹配,但我认为它们匹配),或者文件的名称不正确。我偶尔会遇到这样的问题:字符呈现相同,但实际上是不同的unicode点(可能是句点),这会导致它们成为“不同的文件”,因此不存在。你能用另一个文件重复这个问题吗?@MikeMcDonald我试着用另一个文件下载,结果是一样的;然而,我发现,如果我使用storage.referenceforrl(((storageRef)/(videosRef)/(videoName)“)函数进行直接链接(同时进行一些其他更改,如将所有这些变量更改为字符串),那么它就起作用了,所以问题一定与我如何创建链接有关。唯一的错误是当我打印videosRef.child(videoName)的值时,它与我之前显示的直接值完全相同。你能尝试
让videosRef2=videosRef.child(videoName)
然后使用videosRef2.downloaderwithcompletion
吗。我知道这听起来很愚蠢,但这个案子看起来已经很不错了bizarre@Chris我试过了,但它给出了完全相同的错误。好吧,所以我试着按照你的建议去做,结果出人意料地成功了(在将videosRef.child(videoName)翻译成字符串之后)。更接近了,但仍然不是我想要的。我打印出了video name的值,它是video1.m4v。看起来它仍然应该工作。谢谢你的帮助,但这不起作用。我不仅没有尝试下载图像(这是我尝试下载的视频),而且我已经有了一个从URL播放视频的系统。
storage.referenceForURL(String(videosRef.child(videoName))).downloadURLWithCompletion { (URL, error) -> Void in
videosRef.child(videoName).dataWithMaxSize(INT64_MAX, completion: { (data, error) in
if let error = error {
print("Error downloading: \(error)")
return
}
cell.imageView?.image = UIImage.init(data: data!)
})