0

Я хочу разработать приложение, в котором мне может понадобиться поддержка возобновляемой загрузки файла. Есть ли способ поддержать возобновление загрузки файла. Обратите внимание, что я могу также загружать файлы в очередь.Возобновляемые многофайловые загрузки файлов с использованием AFNetworking в Objective - C

Я использую AFNetworking. Сервер: IIS.

Если возможно, предоставьте надежное решение. Я открыт для обоих (сервер-клиент) решений.

ответ

1

Для возобновляемых загрузок магия должна выполняться на стороне сервера. Серверы, которые я использовал для разработки этих загрузок, использовали библиотеку tusd. https://github.com/tus/tusd

Извините, но я не могу помочь вам гораздо больше на стороне сервера.

КСН вы должны реализовать только три HTTP запросов

  1. A запрос HTTP для генерации идентификатора файла. Вы должны получить идентификатор файла и связать его с вашим файлом (например, в основных данных).

  2. HTTP GET запрос, передающий идентификатор файла, чтобы найти смещение файла (последний байт файла, полученного на сервере).

  3. Запрос HTTP POST для загрузки файла. Если вы работаете с большими файлами, вы должны использовать NSInputStream, чтобы не выделять память.

    func uploadFileStream(file: MyFileClass, fileStream: NSInputStream){ 
    
        self.initialOffset = Double(file.offset) 
        self.currentFile = file 
        self.fileStream = fileStream 
    
        let url = NSURL(string: self.file.url)! 
        var error: NSError? 
    
        let request = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 10.0) 
    
        request.HTTPMethod = "POST" 
        request.addValue(file.identifier, forHTTPHeaderField: Constants.HEADER_FILE_IDENTIFIER) 
        request.addValue(Constants.CONTENT_TYPE_DEFAULT, forHTTPHeaderField: Constants.HEADER_FILE_CONTENT_TYPE) 
    
        var task = session.uploadTaskWithStreamedRequest(request) 
    
        fileStream.open() 
    
        currentTask = task 
        task.resume() 
    } 
    

Также вы должны реализовать NSURLSessionTaskDelegate обеспечить streamRequest ТЕЛО:

func URLSession(session: NSURLSession, task: NSURLSessionTask, needNewBodyStream completionHandler: (NSInputStream!) -> Void) { 
     if let stream = self.fileStream{ 
      // set the current offset as the starting point of the stream 
      stream.setProperty(Int(self.currentFile.offset), forKey: NSStreamFileCurrentOffsetKey) 
      // Set the stream as the request body 
      completionHandler(stream) 
     } 
    } 

     func URLSession(session: NSURLSession, task: NSURLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) { 

      // Save current offset in database. This offset only indicates the amount of bytes sent, not the received in server. 
      let currentOffset = Double(self.initialOffset + Double(totalBytesSent)) 
      FilesDAO.saveOffset(fromFile: self.currentFile, offset: currentOffset) 

    } 

func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?){ 

    if let err = error{ 

     // An error ocurred. You can retry the process of uploading 

    }else{ 

     // The file was uploaded successfully 

    } 
} 

В основном это все, что вам нужно на вашем клиенте. Затем вам нужно будет установить разные заголовки или запросить тело в зависимости от реализации сервера.

+0

Спасибо за руководство по внедрению. Я сконфигурирую эту серверную часть и вернусь к вам, если я получу успех, чтобы принять ваш ответ. –

+0

Также вы можете проверить www.tus.io (не можете добавить ссылку), я только что нашел, что они обеспечивают реализацию в объективном -с. Возможно, он предоставляет только то, что вам нужно –