私は新しい 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 日間グーグル検索しましたが、これを解決するにはいくつかの方法があるようです。
- サードパーティのライブラリを使用します: AFNetworking、ASIHTTPRequest など (ただし、いつメンテナンスや更新が停止するかわからないため、使用したくありません)
- ストリーミングを使用して大きなファイルをアップロードする
そして、ストリーミング方法(ポイント2)を使用してアップロードを行いたいのですが、
次の
リンクを見つけました:http: //zh.scribd.com/doc/51504708/10/Upload-Files-Over-HTTP
、しかし、方法を知ることはまだあまり明確ではありません
質問1 : そのリンクに例があります。アップロード ファイルはバンドルからの
もので、アセットをストリームにする方法は? またはアセットをAPPのフォルダーにコピーしますか?
このリンクCopy image from assets-library to an app folder を
見つけましたが、まだ方法が見つかりません。
質問2 : または、大きなファイルをアップロードするためのより明確なストリーミングの例はありますか?
更新されたあなたの情熱に感謝します
1 :
needNewBodyStreamデリゲートを実装した後、「リクエスト ストリームの枯渇」メッセージは解決されたように見えましたが、代わりに、別の「エラー ドメイン=kCFErrorDomainCFNetwork コード=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;
}