2017-01-10 3 views
0

firebaseからファイルをダウンロードしています。リクエストURLは、私がディレクトリ構造を維持している文書ディレクトリへの迅速なデータ書き込み

func downloadFile(url : String) { 
     let storageR = FIRStorage.storage().reference(withPath: url) 
     let maxSize : Int64 = 3 * 1024 * 1024 // 3MB 

     storageR.data(withMaxSize: maxSize) { (data, error) in 
      if error != nil { 
       print(error.debugDescription) 
       return 
      } 

      print(data!) 
     } 

    } 

は、今私は、URLのディレクトリ構造を維持し、このデータを格納する必要があり、次のコードを使用してファイルをダウンロードすることができます

social-cam-storage/albm-72/owner-2/1484043313786.jpeg

に従っているとしましょう

私は試しました

let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 
print(FileManager.default.createFile(atPath: "\(documentsURL.absoluteString)/\(url)", contents: data!, attributes: nil)) 

しかし、私は間違っています

これを修正する方法または保存する他の方法はありますか?

答えて

0

あなたはこれを試しましたか?すでに文字列として正確なパスをお持ちの場合は

:あなたはパスが必要な場合は

try? data.write(to: URL(fileURLWithPath: path), options: [.atomic]) 

いくつかの方法があります。

func saveFile() { 
    let filePath = getDocumentsURL().absoluteString.appending(path) 
    try? data.write(to: URL(fileURLWithPath: filePath), options: [.atomic]) 
} 

func getDocumentsURL() -> URL { 
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] 
    return documentsURL 
} 

あなたはまた、単にファイル名を保存してください可能性があり、後で必要なときに読み込む:

func fileInDocumentsDirectory(_ filename: String) -> String { 
    let fileURL = getDocumentsURL().appendingPathComponent(filename) 
    return fileURL.path 
} 

// To save file 
func saveFile(data: Data) { 
    let fileName:String = "createUniqueFileName" 
    let filePath = fileInDocumentsDirectory(fileName) 
    saveData(data, filePath) 
} 

// To load file with saved file name 
func loadFile(fileName: String) { 

    if let loadedData = loadData(fileName) { 
     // Handle data however you wish 
    } 

} 

func saveData(_ data: Data, path: String) { 

    try? data.write(to: URL(fileURLWithPath: path), options: [.atomic]) 

} 

func loadData(_ path: String) -> Data? { 

    let data:Data? = try? Data(contentsOf: URL(fileURLWithPath: path)) 

    return data 

} 
+0

動作しません。 "ファイル" 1484043866188.jpegが存在しません。 – LynAs

0

組み込みの「Firebase StorageのAPI「」?

// Create a reference to the file you want to download 
let fileURL = storage.reference(withPath: url) 

// Create local filesystem URL 
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 
let fileURL = ... 

// Download to the local filesystem 
let downloadTask = islandRef.write(toFile: fileURL) { url, error in 
    if let error = error { 
    // Uh-oh, an error occurred! 
    } else { 
    // Local file URL is returned 
    } 
} 
+0

私はこれを最初に試して、次のエラーが発生しました。 'CFURLCopyResourcePropertyForKeyはスキームのないURLが渡されたため失敗しました。 /private/varエラードメイン= NSCocoaErrorDomainコード= 262のために/mobile/Containers/Data/Application/2E4C0A6F-FE93-41AD-9D82-AA501A7C83B6/tmp/CFNetworkDownload_CNxpX3.tmp "指定されたURLタイプがサポートされていないためファイルを開くことができませんでした"ユーザー情報= {NSURL =ソーシャルカムストレージ/ albm-70 /オーナー-2/1484043866188.jpeg} 不明なエラーが発生しました。サーバーの応答を確認してください。 " – LynAs

+1

エラーはかなり合理的です。指定されたURLタイプがサポートされていないために開かれました。 iOSが理解できるURLスキームが必要です: 'file:/// Documents/social-cam-storage/albm-70/owner-2/148404386 6188.jpeg'または使用する適切なディレクトリ(デバイス上のサンドボックス化のために、 'Documents'と' tmp'のみを使用できます)。 –

関連する問題