2012-02-28 18 views
7

私のまだリリースされていません Delphi 2010アプリケーションでは、ユーザーは自分のファイルを自分のサーバーにアップロードできます。サーバー に投稿、各スライスに対して「スライス」(256キロバイトごと) Delphi 2010を使用してアップロードルーチンを最適化する方法は?

    1. 分割ファイル:今、私は(簡体字)アルゴリズムは基本的に、ファイルを送信するためにHTTPS POSTを使用しています

    ie。 1MBのファイルのために:

    --> Get Slice #1 (256KB) 
    --> Upload Slice #1 using TidHTTP.Post() 
    
    --> Get Slice #2 (256KB) 
    --> Upload Slice #2 using TidHTTP.Post() 
    
    --> Get Slice #3 (256KB) 
    --> Upload Slice #3 using TidHTTP.Post() 
    
    --> Get Slice #4 (256KB) 
    --> Upload Slice #4 using TidHTTP.Post() 
    

    私はインディ10を使用しています。私(ab)は私のプロファイラを何度も繰り返し使用していました。

    多くを達成しない他のよく最適化されたソフトウェアがあり、私もマルチスレッドを使用している、と私は私のコードを最適化するために私のベストを尽くしたにもかかわらず、私のベンチマークはまだ私はより良い行うことができますを教えて

    1. 私はグループ化しようとしたが:より良いタイミング...のほぼ2倍の速さ私のアップロード・ルーチン)

      私はそれが私のサーバーのせいではありません知っている...ここで私はまだ模索する必要があるのアイデアがあります単一のPOSTでスライスを作成すると、自然にパフォーマンスが向上しました(20〜35%)、再開能力が低下する。

    2. 私はSFTP/SSHの使用についても考えましたが、高速かどうかはわかりません。

    3. ウェブソケットを使用して再開可能なアップロード(this componentなど)を実装すると、速度についてもわかりません。

    私のアップロードにスピードアップする方法がありますか?私は、(ライセンスは私が自分のアプリケーションでそれを出荷することを可能にするならば)私はコマンドラインツールを含む、実装することができ任意の提案に開いていることを提供する:

    1. 再開可能アップロードが
    2. が速いサポートされています!
    3. 合理的なメモリ使用量
    4. セキュア&また、ログイン/ユーザ認証

    を許可、ための主要なセキュリティ上の懸念のため、FTPは私が実装したいと思いませんものです。

    ありがとうございます!

  • +1

    転送でデータ圧縮/圧縮解除が使用されていますか? – mjn

    +0

    サーバー側には何がありますか? – kobik

    +0

    @mjn:はい(スライスはすでにアップロード前に圧縮されています+私はIndyのTIdCompressorZLibを使用しています) – TheDude

    答えて

    5

    ファイル全体に対して1つのTIdHTTP.Post()を実行することをお勧めします。 TIdHTTP.OnWork...イベントを使用して、サーバーに送信されたバイト数を追跡​​し、必要に応じてどこから再開するかを知ることができます。再開するときにはTIdHTTP.Request.CustomHeadersプロパティを使用して、再開する場所をサーバーに示すカスタムヘッダーを含めて、新しいデータを受け入れる前に指定したオフセットに前のファイルをロールバックすることができます。

    +0

    それは素晴らしいです、私はPOSTを再開できるかどうか分からなかった。私はこの権利があるかどうかを見てみましょう:PHPコードで、私はこれを追加します - >ヘッダ( 'Accept-Ranges:bytes'); Delphiではこれを追加します(例のみ):IdHTTP.Request.CustomHeaders.Add( 'Range:bytes = 5000-'); HTTP POSTは自動的に5000バイト目から余分なバイト(ロールバック)とピックアップを破棄しますが、それは正しいのですか? – TheDude

    +0

    前の 'POST'を再開するには、残りのデータだけを持つ' TStream'を渡すことができます。しかし、サーバーはレジュームをサポートし、新しいデータを既存のファイルに追加し、新しいファイルを上書きしないようにする必要があります。アップロードの再開は、標準HTTPプロトコルの一部ではありません。 'Accept-Ranges'レスポンスヘッダーと' Range'リクエストヘッダーは、**ダウンロード**ではなく、** uploads **のためのものです。私がカスタムヘッダーに言及したとき、私はあなたのPHPコードで探すことができるカスタムの 'X -...'ヘッダーを参照していました。例えば、' X-Resuming-From:... 'です。 –

    +0

    あるいは 'Content-Range'ヘッダーですが、RFC 2616では、通常はリクエストではなくレスポンスでのみ使用されることが示唆されています。 –

    関連する問題