iOS, как загрузить большой файл активов в сервер потоковой передачи
Я новый программист iOS.
Я хочу загрузить большой файл (видео или изображение) избиблиотека активов в мой, мой оригинальный способ просто использоватьNSMutableURLRequest и добавитьNSData(большое видео или большое изображение), и сбой произошел в следующем коде:
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset){
//.......some code I just skip it...
ALAssetRepresentation *rep = [asset defaultRepresentation];
void *buffer = [rawData mutableBytes];
[rep getBytes:buffer fromOffset:0 length:size error:nil];
NSData *videoData = [[NSData alloc] initWithBytes:buffer length:size];//crash here
[self startUploading:videoData];
}
Я знаю, что это сбой, потому что памяти недостаточно, видеофайл не может быть просто выделен для NSData.
Я гуглю это в течение 2 дней, и кажется, есть несколько способов решить эту проблему.
и я хочу использовать потоковый способ (пункт 2), чтобы загружать вещи,
Я нашел эту ссылку:http://zh.scribd.com/doc/51504708/10/Upload-Files-Over-HTTP
Похоже, может решить мою проблему, но все еще не очень понятно, как это сделать
Вопрос 1: в этой ссылке есть пример, файл для загрузки из пакета
как превратить актив в поток? или скопировать актив в папку приложения?
Я нашел эту ссылкуСкопируйте изображение из библиотеки ресурсов в папку приложения
но до сих пор не могу найти дорогу.
Вопрос 2: или есть другой более понятный пример потоковой передачи для загрузки большого файла?
Спасибо за вашу страсть
updated1: после того, как я реализовал делегат needNewBodyStream, сообщение «исчерпание потока запросов», похоже, решено, но вместо этого встретил другое «Ошибка Domain = kCFErrorDomainCFNetwork Code = 303« Операция не может быть завершена ». Как ее решить?
-(NSInputStream *)connection:(NSURLConnection *)connection needNewBodyStream:(NSURLRequest *)request
{
[NSThread sleepForTimeInterval:2];
NSInputStream *fileStream = [NSInputStream inputStreamWithFileAtPath:pathToBodyFile];
if (fileStream == nil) {
NSLog(@"NSURLConnection was asked to retransmit a new body stream for a request. returning nil!");
}
return fileStream;
}