Невозможно загрузить несколько файлов с помощью alamofire с исходного URL-адреса swift - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь загрузить файл изображения (.jpg) и файл PDF (.pdf) в то же время, используя Alamofire. Я продолжаю получать следующую ошибку, которая указывает, что файлы, которые я пытаюсь загрузить, не существуют, что на самом деле они делают.

 multipartEncodingFailed(Alamofire.AFError.MultipartEncodingFailureReason.bodyPartFileNotReachableWithError(atURL: file:///var/mobile/Containers/Data/Application/7FF74F06-CD6E-47D6-850E-45E768C00D97/Documents/tempImage_wb.jpg, error: Error Domain=NSCocoaErrorDomain Code=260 "The file “tempImage_wb.jpg” couldn’t be opened because there is no such file." UserInfo={NSURL=file:///var/mobile/Containers/Data/Application/7FF74F06-CD6E-47D6-850E-45E768C00D97/Documents/tempImage_wb.jpg, NSFilePath=/var/mobile/Containers/Data/Application/7FF74F06-CD6E-47D6-850E-45E768C00D97/Documents/tempImage_wb.jpg, NSUnderlyingError=0x1c4841020 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}))

Мой код для загрузки файлов:

 // GET URL FOR IMAGE AND PDF FILES
    guard
        let imageURLString = UserDefaults.standard.string(forKey: "URL_IMAGE"),
        let pdfURLString = UserDefaults.standard.string(forKey: "URL_PDF") else{return}


    guard
        let imgURL = URL.init(string: imageURLString),
        let pdfURL = URL.init(string: pdfURLString) else{return}

    var arrayURLToUpload: [URL] = []
    arrayURLToUpload.append(imgURL)
    arrayURLToUpload.append(pdfURL)



 let sendParamters = ["user_id": "1", "hashTagArray": jsonArrayHashTags]
    Alamofire.upload(
        multipartFormData: { multipartFormData in
            for(key, value) in sendParamters{
                multipartFormData.append((value.data(using: .utf8)!), withName: key)
            }

            for fileURL in arrayURLToUpload{
                print("fileURL: \(fileURL)")
                multipartFormData.append(fileURL, withName: "file[]")
            }
    },
        to: UPLOAD_URL,
        encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    debugPrint(response)
                }

                /**TRACK PROGRESS OF UPLOAD**/
                upload.uploadProgress { progress in
                    print(progress.fractionCompleted)


                }
                /***/


            case .failure(let encodingError):
                print(encodingError)
            }
        }
    )

Консоль

 fileURL: file:///var/mobile/Containers/Data/Application/7FF74F06-CD6E-47D6-850E-45E768C00D97/Documents/tempImage_wb.jpg
 fileURL: file:///var/mobile/Containers/Data/Application/7FF74F06-CD6E-47D6-850E-45E768C00D97/Documents/tempImagePDF.pdf

Я знаю, что файлы существуют, потому что, когда я извлекаю один из файлов (.pdf) и отображаю его, я могу просмотреть сохраненный файл PDF:

    guard let urlString = UserDefaults.standard.string(forKey: "URL_PDF") else{return}

    guard let pdfURL = URL.init(string: urlString) else{
        print("no pdf URL")
        return

    }
    print("pdfURL: \(pdfURL)")

    guard let pdf = PDFDocument.init(url: pdfURL) else{
        print("NO PDF DOCUMENT FOUND")
        return

    }

    pdfPreview.document = pdf // CAN VIEW PDF FILE!!!
    pdfPreview.autoScales = true

    print("pdf document displayed!")

Консоль

 pdfURL: file:///var/mobile/Containers/Data/Application/90ECD1AE-B9A5-46C9-AD30-C5D8D850A361/Documents/tempImagePDF.pdf

 pdf document displayed!

Как я генерирую свои URL:

 // Create a URL to save PDF
func createPdfURL() -> URL {

    let fileName = "tempImagePDF.pdf"

    let documentsDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentDirectory = documentsDirectories.first!
    let pdfPageURL = documentDirectory.appendingPathComponent("\(fileName)")

    return pdfPageURL
}

Затем я сохраняю PDF документ следующим образом:

 // SAVE PDF TO LOCAL FILE SYSTEM
func savePdfToLocaFile(pdf: PDFDocument) -> Void {

    // CREATE URL FOR PDF DOCUMENT
    let pdfURL = createPdfURL()
    print("PDF SAVED TO URL: \(pdfURL)")

    self.pdfDocumentURL = pdfURL

    pdf.write(to: pdfURL)


}

Я также попытался выполнить следующие действия для получения файлов путем восстановления URL-адреса по имени файла перед его использованием для загрузки файлов:

 // CONSTRUCT URL FROM FILE NAME
    let imgFileName = "tempImage_wb.jpg"
    let pdfFileName = "tempImagePDF.pdf"

    var dir: URL!
    do {
        dir = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    } catch{
        print("error re-creating url")
    }

    let imgURL = dir.appendingPathComponent(imgFileName)
    let pdfURL = dir.appendingPathComponent(pdfFileName)

чтение новой консоли после реализации предложения @ vadian:

PDF SAVED TO URL: file:///var/mobile/Containers/Data/Application/35C9D3EE-2D0C-4028-BCF3-2FE4581A0686/Documents/tempImagePDF.pdf
fileURL: file:///var/mobile/Containers/Data/Application/35C9D3EE-2D0C-4028-BCF3-2FE4581A0686/Documents/tempImagePDF.pdf

1 Ответ

0 голосов
/ 02 сентября 2018

Обратите внимание на разные идентификаторы контейнера приложения 7FF74F06-CD6E-47D6-850E-45E768C00D97 и 90ECD1AE-B9A5-46C9-AD30-C5D8D850A36.

Местоположения контейнера периодически меняются, поэтому никогда не сохраняйте полные пути, указывающие на контейнер приложения, в UserDefaults. Сохраняйте только имена файлов и получайте URL-адрес текущего каталога документов всегда с помощью

let documentsFolderURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

Затем добавьте имя файла с помощью .appendingPathComponent

Примечание: try! безопасен, потому что каталог document всегда создается платформой.

...