下载具有正确扩展名的文件

Download file with right extension

下载文件时出现问题。

我正在尝试下载一个文件格式 url 并将其推送到 open/share 模式。但是 da 数据下载为数据,如果我尝试将它保存到文件应用程序,它会保存一个名为数据的文件。

我只需要下载并共享带有原始扩展名的文件。喜欢 file.extension.

下面是代码使用。我在这里使用了 Alamofire pod:

AF.download(url).responseData { response in
    if let preset = response.value {
        let shareArray = [preset]
        let activityViewController = UIActivityViewController(activityItems: shareArray , applicationActivities: nil)
                activityViewController.popoverPresentationController?.sourceView = self.view
        self.present(activityViewController, animated: true, completion: nil)
    }
}

也尝试过此代码,但应用程序崩溃了:

if let url = URL(string: downloadURL!) {

    let task = URLSession.shared.downloadTask(with: url) { localURL, urlResponse, error in
        if let localURL = localURL {
            let shareArray = [localURL]
            let activityViewController = UIActivityViewController(activityItems: shareArray , applicationActivities: nil)
            activityViewController.popoverPresentationController?.sourceView = self.view
            self.present(activityViewController, animated: true, completion: nil)
        }
    }

    task.resume()
}

问题在于您正在尝试共享返回的临时文件。它有一个 dynamic UTI(统一类型标识符)。您需要获取 url 响应建议的文件名并重命名该文件。

import UIKit
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

extension URL {
    var typeIdentifier: String? { (try? resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier }
}

let url = URL(string: "https://i.stack.imgur.com/varL9.jpg")!
URLSession.shared.downloadTask(with: url) { location, response, error in
    guard let location = location,
          let httpURLResponse = response as? HTTPURLResponse,
          httpURLResponse.statusCode == 200 else { return }
    let fileName = httpURLResponse.suggestedFilename ?? httpURLResponse.url?.lastPathComponent ?? url.lastPathComponent
    let destination = FileManager.default.temporaryDirectory.appendingPathComponent(fileName)
    do {
        if FileManager.default.fileExists(atPath: destination.path) {
            try FileManager.default.removeItem(at: destination)
        }
        print("location", location.typeIdentifier ?? "no UTI")  // location dyn.ah62d4rv4ge81k5pu
        try FileManager.default.moveItem(at: location, to: destination)
        print("destination", destination.typeIdentifier ?? "no UTI")   // destination public.jpeg
    } catch {
        print(error)
    }
}.resume()

要完成@leo Dabus 的回答,需要进一步修改目标URL 并使用

附加您想要的文件扩展名

FileManager.default.moveItem(在:至:)

https://developer.apple.com/documentation/foundation/filemanager/1414750-moveitem

        func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
         // create destination URL with the original pdf name
         print("fileDownload: urlSession")
         guard let url = downloadTask.originalRequest?.url else { return }
         print("fileDownload: urlSession \(url)")
         let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
         let destinationURL = documentsPath.appendingPathComponent(url.lastPathComponent)
         // delete original copy
         try? FileManager.default.removeItem(at: destinationURL)
         // append a new extension type
       let newURL = destinationURL.deletingPathExtension().appendingPathExtension("pdf")   
       // copy from temp to Document
       try? FileManager.default.moveItem(at: destinationURL, to: newURL)
         do {
             try FileManager.default.copyItem(at: location, to: newURL)
             myViewDocumentsmethod(PdfUrl:destinationURL)
             print("fileDownload: downloadLocation", destinationURL)
         } catch let error {
             print("fileDownload: error \(error.localizedDescription)")
         }
     
     }