将使用 Alamofire 下载的文件访问到具有未知文件名的下载目录

Posted

技术标签:

【中文标题】将使用 Alamofire 下载的文件访问到具有未知文件名的下载目录【英文标题】:Access file downloaded with Alamofire to downloadsdirectory with unknown filename 【发布时间】:2019-02-04 04:02:08 【问题描述】:

我有一个用于 ios 的应用程序,它使用金属来呈现 obj 文件。我正在尝试为用户添加功能以在线插入 obj 文件的 url 并呈现它。我正在使用 alamofire,但不知道下载后如何访问该文件,因为我不知道文件名。

let destination = DownloadRequest.suggestedDownloadDestination(for: .downloadsDirectory)

let modelUrl = URL(string: "https://drive.google.com/file/d/110KRnku3N_K_EIN-ZLYXK128zjMqxGLM/view?usp=sharing")

Alamofire.download(
    modelUrl!,
    method: .get,
    parameters: Parameters.init(),
    encoding: JSONEncoding.default,
    headers: nil,
    to: destination).downloadProgress(closure:  (progress) in
        //progress closure
    ).response(completionHandler:  (DefaultDownloadResponse) in
        //here you able to access the DefaultDownloadResponse
        //result closure
    )
let file = try? String(contentsOf: URL(string: (NSSearchPathForDirectoriesInDomains(.downloadsDirectory, .userDomainMask, true)[0]))!)

我也相当肯定我检索文件的方法不起作用,但我不确定如何在文档目录中搜索特定文件。 我工作的文件在项目中作为 xcode 中的 .obj 文件,我只是使用它。

let assetURL = Bundle.main.url(forResource: modelName, withExtension: "obj")

【问题讨论】:

【参考方案1】:

Bundle.main 不会返回document directory 中的文件,它用于放置在主包中的文件(通常在开发时在 Xcode 中)。您需要使用FileManager 访问document directory 中的文件。您可以使用此功能在您的文档目录中搜索文件。

func getFilePathInDocuments(fileName:String) -> String 
    let path        = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url         = URL(fileURLWithPath: path)
    let fileManager = FileManager.default
    let filePath    = url.appendingPathComponent(fileName).path

    if (fileManager.fileExists(atPath: filePath)) 
        return filePath
    else
        return ""
    

这就是你的称呼:

let foundPath = getFilePathInDocuments(fileName: "fileName.obj")

更新

您可以将fileName 发送给Almofire,您也会从那里收到下载的URL。

let destinationPath: DownloadRequest.DownloadFileDestination =  _, _ in
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0];
    let fileURL = documentsURL.appendingPathComponent("fileName")
    return (fileURL, [.removePreviousFile, .createIntermediateDirectories])


Alamofire.download(url, to: destinationPath)
    .downloadProgress  progress in
    
    .responseData  response in

要获取下载的文档目录 URL,请使用 response.destinationURL

【讨论】:

是的,我将 Bundle.main 用于我放入 xcode 项目中的文件。 let file = try? String(contentsOf: URL(string: (NSSearchPathForDirectoriesInDomains(.downloadsDirectory, .userDomainMask, true)[0]))!) 是我尝试下载的文件。我会试试这个并回复你,谢谢。 如何获取我从 Alamofire.download 下载的文件的名称(或其他 Alamofire 方法?) @GabeSpound 是的,但您需要先给出名称才能更好地进行搜索操作。查看更新的答案。

以上是关于将使用 Alamofire 下载的文件访问到具有未知文件名的下载目录的主要内容,如果未能解决你的问题,请参考以下文章

具有 Alamofire 下载功能的 JWT 身份验证

使用 Alamofire 将文件保存到 .DocumentDirectory

如何使用 Alamofire 访问具有无效证书的本地 Https?

将通过 AlamoFire 下载的 MPEG 音频文件转换为 mp3 文件

如何使用 AlamoFire 下载 blob URI

在 Alamofire 4 中动态允许自签名证书