Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Firebase downloadURLWithCompletion错误_Ios_Swift_Firebase_Firebase Storage - Fatal编程技术网

Ios Firebase downloadURLWithCompletion错误

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

我正在尝试从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}
所以,我试着使用直接链接,它成功了

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!)
})