5

バイナリのアップロードを受け入れるセルフホステッド .NET サービスを作成しました。

[ServiceContract]
public interface IBinaryService
{

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "up/file/{fileName}/{hash}")]

    void FileUpload(string fileName, string hash, Stream fileStream);

ファイルを受信すると、まずそのファイルがすでにシステム上にあるかどうかを確認します。そうでない場合は、クライアントからファイルをストリーミングして保存します。

    public void FileUpload(string fileName, string hash, Stream fileStream)
    {
        string filebasedir = basedir + @"file\"; //" 
        if (File.Exists(filebasedir + hash))
        {

            WebOperationContext.Current.OutgoingResponse.StatusCode = 
                                   System.Net.HttpStatusCode.Conflict;
            return;
        }

        using(var fileToupload = new FileStream(
                string.Concat(filebasedir, hash),
                FileMode.Create))
                {
                fileStream.CopyTo(fileToupload);
                }

コードをステップ実行すると、サーバーがパラメーターを読み取り、競合があるかどうかを判断するまで、ファイルの内容がストリーミングされないことがわかります。サーバーが完全なコンテンツ (数メガバイトになる可能性があります) を読み取らないようにする必要があります。残念ながら、「return」を使用してメソッドを早期に終了しても、これは行われません。

これは可能ですか?

4

4 に答える 4

4

あなたが直面している問題を正しく理解していれば..

クライアントがメソッドを呼び出す

void FileUpload(string fileName, string hash, Stream fileStream);

そして、その関数を呼び出すとすぐに、サーバーへのファイルのアップロードを開始します。ファイルがサーバーに既に存在する場合、ファイルのアップロードを回避または中断したい。

メソッドを 2 つに分割しないのはなぜですか。一方のメソッドは、ファイルがサーバー上に既に存在するかどうかをチェックし (引数 filename と hash の 2 つしか持たず、 filestream を渡さないでください)、true または false を返します。存在しない場合は、filestream パラメーターを指定して 2 番目のメソッドを呼び出します。

そうすれば、問題が解決するはずです。

于 2012-05-03T07:40:37.670 に答える
0

フレームワークに組み込まれている機能 (サーバー側のファイル アップロード コントロール) は、アップロード プロセス中にチャンクで受信したデータを処理するためのより細かいレベルの粒度を提供しません。ファイルの最後に到達するか、エラー状態になるまで、メモリ内のすべてのデータをバッファリングするだけです。

したがって、唯一のオプションは次のいずれかです。

1) バイナリ ファイル アップロード ハンドラ (httpHandler) を作成して、自分で実行します。不可能ではありませんが、一見しただけでは簡単ではありません。これには、要求のエンコード方法を決定し、可能なバリエーションに対して適切な手法を使用して、ストリーム内のエンコードされたバイナリ データを適切にデコードすることが含まれます。

2) はるかに簡単な解決策は、この機能を実装し、独自のコードを駆動するために使用できるイベントを公開する既存の商用コントロールの 1 つを使用することです。たとえば、一例としてABCUpload.NETを見てみましょう。もう 1 つはPowUploadです。

于 2012-05-02T22:26:50.200 に答える
-1

可能です。エラー コードを含む応答を返すだけで、ファイルをストリーミングしません。

于 2012-04-24T21:01:27.753 に答える