我试图从我的Firebase存储下载视频。我这样做的方式是使用.downloadURLWithCompletion
函数。曾经在函数执行的时候,我收到此错误Firebase downloadURL完成错误
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}
下面是访问火力地堡存储代码:
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.
}
所以,我想USI直接链接,它的工作!
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
我编组的链接到我的火力存储,但我可以向你保证该链接是正确的。
有人可以向我解释为什么我得到这个错误?对我来说,一切看起来都很到位。
谢谢!
一切看起来都对我很好 - 这就是为什么我感到困惑。 404意味着没有找到该对象,这意味着该存储桶是错误的(因为它被空白了,我看不到它们是否匹配,但我假设它们是这样做的),或者该文件以某种方式命名不正确。我偶尔会看到字符呈现相同的问题,但实际上是不同的unicode点(可能是这个时间段),这会导致它们成为“不同的文件”,因此不存在。你可以用另一个文件重复这个问题吗? –
@MikeMcDonald Ive尝试使用不同的文件下载它,它具有相同的结果;然而,我发现,如果我要使用storage.referenceForURL(“\(storageRef)/ \(videosRef)/ \(videoName)”)函数进行直接链接(以及进行一些其他更改,例如更改所有这些变量到字符串)然后它的工作,所以问题必须与我如何创建链接。唯一错误的是,当我打印videosRef.child(videoName)的值与我之前展示的直接相同时。 – pjtnt11
你可以试试'让videosRef2 = videosRef.child(videoName)',然后使用'videosRef2.downloadURLWithCompletion'代替。我知道这听起来很愚蠢,但这种情况已经看起来很奇怪 – Chris