5

私は新しい 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 日間グーグル検索しましたが、これを解決するにはいくつかの方法があるようです。

  1. サードパーティのライブラリを使用します: AFNetworking、ASIHTTPRequest など (ただし、いつメンテナンスや更新が停止するかわからないため、使用したくありません)
  2. ストリーミングを使用して大きなファイルをアップロードする

そして、ストリーミング方法(ポイント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;
}
4

2 に答える 2

0

ALAssetToNSInputStreamと呼ばれる一番上の回答で説明されているものを実装ALAssetするNSInputStreamvia への変換の迅速なバージョンがあります。必要に応じてチェックしてください。CFStreamCreateBoundPair

于 2016-05-30T02:17:32.543 に答える