2015-10-06 3 views
2

В настоящее время я использую следующий код для загрузки файлов на серверPHAsset + AFNetworking. Невозможно загрузить файлы на сервер, на реальном устройстве

NSURLRequest *urlRequest = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:[[entity uploadUrl]absoluteString] parameters:entity.params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 

    // Get file url 
    [UploadModel getAassetUrl:entity.asset resultHandler:^(NSURL *fileUrl) { 

    NSError *fileappenderror; 
    // Append 
       [formData appendPartWithFileURL:fileUrl name:@"data" error:&fileappenderror]; 

       if (fileappenderror) { 
        [Sys MyLog: [fileappenderror localizedDescription] ]; 
       } 
      }]; 

     } error:&urlRequestError]; 

/* getAassetUrl */

+(void)getAassetUrl: (PHAsset*)mPhasset resultHandler:(void(^)(NSURL *imageUrl))dataResponse{ 

    PHImageRequestOptions * requestOption = [[PHImageRequestOptions alloc] init]; 
    requestOption.synchronous = YES; 
    requestOption.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat; 

     [[PHImageManager defaultManager] requestImageDataForAsset:mPhasset options:requestOption resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 

     dataResponse([info objectForKey:@"PHImageFileURLKey"]); 

    }]; 
} 

Этот подход работает на симулятор, но не работает на реальном устройстве: пустые файлы загружаются на сервер, скорее всего, из-за невозможности чтения из локального хранилища. журнал показывает Уведомлении

Примечание: Песочница: MyApp (213) отрицающие файл читаемый-данные /private/var/mobile/Media/DCIM/101APPLE/IMG_1570.PNG

I Believe это означает, что приложение не может получить доступ к файлу по указанному пути. Также я попытался загрузить альтернативный подход, добавив NSData, который возвращается из запроса данных PHAsset. но этот подход непригоден для больших файлов мультимедиа. так как весь файл загружается в память.

Любые мысли?

ответ

3

Объект NSData, возвращаемый requestImageDataForAsset, имеет карту памяти - поэтому весь файл не загружается в память. Таким образом, этот метод будет без каких-либо проблем для изображений.

Для видео, которые вы должны использовать соответствующие методы requestExportSessionForVideo или requestAVAssetForVideo Если вы можете ограничить цель развертывания для прошивки 9, вы также должны взглянуть на методах PHAssetResourceManager

5

Вы не должны использовать requestImageDataForAsset(_:options:resultHandler:) для большого файлы. Причина, заключающаяся в том, что вы не хотите загружать весь медиафайл в память, вы быстро исчерпаете память, и приложение выйдет из строя. Обычно это означает, что вы не должны использовать его для больших изображений или почти любого видео.

По моему опыту, попытка загрузить напрямую с URL-адреса ресурса PHASset не удастся. Apple, похоже, не предоставляет нам разрешения, необходимые для загрузки напрямую из исходных файлов PHAsset. Посмотреть сообщение форума here. Это боль, потому что это заставляет нас использовать тонну дополнительного дискового пространства, если мы хотим загрузить видео.

Для того, чтобы получить локальный URL файла для видео файла, который вы собираетесь загрузить, вы хотите использовать:

requestExportSessionForVideo(_:options:exportPreset:resultHandler:)

или

requestAVAssetForVideo(_:options:resultHandler:)

Вы будут использовать эти методы для экспорта копии видеофайла в местоположение на диске, который вы контролируете. И загрузить из этого файла. Бонусная функция: оба эти метода будут загружать файл из iCloud, если это необходимо.

Ознакомьтесь с библиотекой VimeoUpload для получения подробной информации обо всех вещах, связанных с загрузкой видео. Отказ от ответственности: я один из авторов библиотеки.

Даже если вы не загружать на серверы Vimeo, вы можете использовать PHAssetExportSessionOperation и ExportOperation классы, включенные в VimeoUpload делать именно то, что вы хотите сделать. См. README repo для получения более подробной информации о obtaining a file url for a PHAsset. Он также включает инструменты для obtaining a file url for an ALAsset.

Если вы не заинтересованы в использовании PHAssetExportSessionOperation или ExportOperation, ознакомьтесь с их вариантами реализации, чтобы узнать, как использовать классы Apple под капотом.

Смежные вопросы