user6595707
user6595707

Reputation:

Firebase Storage download to local file error

I'm trying to download the image f5bd8360.jpeg from my Firebase Storage.
When I download this image to memory using dataWithMaxSize:completion, I'm able to download it.

My problem comes when I try to download the image to a local file using the writeToFile: instance method.

I'm getting the following error:

Optional(Error Domain=FIRStorageErrorDomain Code=-13000 "An unknown
error occurred, please check the server response."
UserInfo={object=images/f5bd8360.jpeg,
bucket=fir-test-3d9a6.appspot.com, NSLocalizedDescription=An unknown
error occurred, please check the server response.,
ResponseErrorDomain=NSCocoaErrorDomain, NSFilePath=/Documents/images,
NSUnderlyingError=0x1700562c0 {Error Domain=NSPOSIXErrorDomain Code=1
"Operation not permitted"}, ResponseErrorCode=513}"

Here is a snippet of my Swift code:

@IBAction func buttonClicked(_ sender: UIButton) {

        // Get a reference to the storage service, using the default Firebase App
        let storage = FIRStorage.storage()

        // Get reference to the image on Firebase Storage
        let imageRef = storage.reference(forURL: "gs://fir-test-3d9a6.appspot.com/images/f5bd8360.jpeg")

        // Create local filesystem URL
        let localURL: URL! = URL(string: "file:///Documents/images/f5bd8360.jpeg")

        // Download to the local filesystem
        let downloadTask = imageRef.write(toFile: localURL) { (URL, error) -> Void in
            if (error != nil) {
                print("Uh-oh, an error occurred!")
                print(error)
            } else {
                print("Local file URL is returned")
            }
        }
    }

I found another question with the same error I'm getting but it was never answered in full. I think the proposal is right. I don't have permissions to write in the file. However, I don't know how gain permissions. Any ideas?

Upvotes: 4

Views: 3617

Answers (1)

Rufat Mirza
Rufat Mirza

Reputation: 1533

The problem is that at the moment when you write this line:

let downloadTask = imageRef.write(toFile: localURL) { (URL, error) -> Void in
etc.

you don't yet have permission to write to that (localURL) location. To get the permission you need to write the following code before trying to write anything to localURL

let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let localURL = documentsURL.appendingPathComponent("filename")

By doing it you will write the file into the following path on your device (if you are testing on the real device): file:///var/mobile/Containers/Data/Application/XXXXXXXetc.etc./Documents/filename

If you are testing on the simulator, the path will obviously be somewhere on the computer.

Upvotes: 14

Related Questions