#ios #swift #download-manager
#iOS #swift #менеджер загрузок
Вопрос:
Я пытаюсь загрузить файл с удаленного сервера. Файл доступен, и загрузка также завершается. Имя файла, которое я отправляю этой функции из collectionview с файлами, поэтому имя правильное. Но у меня есть некоторые проблемы с сохранением файла. Вот мой способ загрузки файла:
func testLoad(attachName:String) {
let documentsUrl:URL = (FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first as URL?)!
let destinationFileUrl = documentsUrl.appendingPathComponent(attachName)
var request = URLRequest(url: Pathes.init(endpoint: "message/(mModel?.id ?? -1)/attachment/(attachName)?type=(mType ?? -1)").resourseUrl)
request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer " UserDefaults.standard.string(forKey: "access_token")!, forHTTPHeaderField: "Authorization")
let task = URLSession(configuration: URLSessionConfiguration.default).downloadTask(with: request) { (tempLocalUrl, response, error) in
if let tempLocalUrl = tempLocalUrl, error == nil {
print("(tempLocalUrl) ---> (destinationFileUrl)")
if ((response as? HTTPURLResponse)?.statusCode) != nil {
do {
try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
} catch (let writeError) {
print("Error creating a file (destinationFileUrl) : (writeError)")
}
}
} else {
print("Error took place while downloading a file. Error description: %@", error?.localizedDescription);
}
}
task.resume()
}
И ниже вы можете увидеть мою ошибку:
Error creating a file file:///Users/angor/Library/Developer/CoreSimulator/Devices/B83E640A-8EC4-475A-B272-5D884B611A8B/data/Containers/Data/Application/3DE475CE-B2B3-4971-9382-1F272160B1A4/Downloads/paolo-nicolello-dqy5wtCdS4U-unsplash.jpg : Error Domain=NSCocoaErrorDomain Code=516 "“CFNetworkDownload_mw7QwY.tmp” couldn’t be copied to “Downloads” because an item with the same name already exists." UserInfo={NSSourceFilePathErrorKey=/Users/angor/Library/Developer/CoreSimulator/Devices/B83E640A-8EC4-475A-B272-5D884B611A8B/data/Containers/Data/Application/3DE475CE-B2B3-4971-9382-1F272160B1A4/tmp/CFNetworkDownload_mw7QwY.tmp, NSUserStringVariant=(
Copy
), NSDestinationFilePath=/Users/angor/Library/Developer/CoreSimulator/Devices/B83E640A-8EC4-475A-B272-5D884B611A8B/data/Containers/Data/Application/3DE475CE-B2B3-4971-9382-1F272160B1A4/Downloads/paolo-nicolello-dqy5wtCdS4U-unsplash.jpg, NSFilePath=/Users/angor/Library/Developer/CoreSimulator/Devices/B83E640A-8EC4-475A-B272-5D884B611A8B/data/Containers/Data/Application/3DE475CE-B2B3-4971-9382-1F272160B1A4/tmp/CFNetworkDownload_mw7QwY.tmp, NSUnderlyingError=0x60000232c150 {Error Domain=NSPOSIXErrorDomain Code=17 "File exists"}}
Я не могу понять, почему это происходит. Ошибка говорит о том, что мой файл существует, но я не вижу никаких новых файлов в моем Downloads
каталоге. Я думаю, что проблема связана с временным файлом, в который необходимо скопировать Downloads
. Я нашел этот способ загрузки файлов здесь, может быть, я сделал что-то не так?
Комментарии:
1. «но я не вижу никаких новых файлов в моем каталоге загрузок» И что, если вы используете
FileManager
для проверки, существует ли файл в path?2. @Larme, как я могу это сделать? Я не вижу никаких новых файлов в каталоге 🙂
3.developer.apple.com/documentation/foundation/filemanager/… ?
4. Нет, этот файл не существует, я его проверил:( Я думаю, что из-за ошибки я не могу его скопировать 🙁
Ответ №1:
Мне удалось выяснить, в чем проблема 🙂 Я добавил удаление временно созданного файла из tmp
папки, а также переместил весь код загрузки файла в расширение:
extension UIViewController:URLSessionDownloadDelegate{
public func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
guard let url = downloadTask.originalRequest?.url else { return }
let documentsPath = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask)[0]
let destinationURL = documentsPath.appendingPathComponent(url.lastPathComponent)
try? FileManager.default.removeItem(at: destinationURL)
do {
try FileManager.default.copyItem(at: location, to: destinationURL)
} catch let error {
print("Copy Error: (error.localizedDescription)")
}
}
}
Может быть, это поможет кому-то еще, кроме меня 🙂
Комментарии:
1. Без .removeItem я не могу получить доступ к файлу, спасибо за ваше решение.