3

HttpPostedFile などの .NET でファイルをアップロードするさまざまな方法を見て、HttpHandler を使用して、プロセスがどのように機能するかをもう少し詳しく理解しようとしています。

具体的には、情報をファイルに書き込む方法です。

私は次のものを持っているとしましょう:

HttpPostedFile file = context.Request.Files[0];
file.SaveAs("c:\temp\file.zip");

完全なストリームが処理されるようになるまで、実際のファイルは作成されません。

同様に:

using (Stream output = File.OpenWrite("c:\temp\file.zip"))
using (Stream input = file.InputStream)
{
    byte[] buffer = new byte[8192];
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}

これは、ストリームを読み取るときにファイルを「プログレッシブ」に書き込むと考えていました。ファイルシステムを見ると、これはまったく行われていないようです。while 内でブレークポイントを指定すると、それは実行されます。

私がやろうとしているのは、(javascript アップローダーを使用して) ファイルをアップロードし、ポーリングすることです。これにより、ポーリング ajax リクエストは、アップロードされたファイルの fileinfo(ファイル サイズ) を毎秒取得しようとします。ただし、アップロードが完了するまでは常に 0 を返します。

Vimeo はこのタイプの機能を実行できるようです (IE の場合)?? これは .NET の制限ですか、それともストリームからファイルを段階的に書き込む方法はありますか?

4

1 に答える 1

2

2 つのポイント:

まず、Windows では、表示されるファイルのサイズが常に更新されるわけではありません。ファイルは確かに継続的に拡大している可能性がありますが、サイズが増加するのは 1 回だけです。

次に (この場合はより可能性が高い)、ストリームがディスクにフラッシュされていない可能性があります。output.Flush()への呼び出しの後に追加することで、それを強制することができoutput.Write()ます。ただし、パフォーマンスに悪影響を与える可能性があるため、これを実行したくない場合があります。

Lengthおそらく、ファイル システムを経由する代わりに、出力ストリームのプロパティを直接ポーリングできます。

編集:

ストリームのLengthプロパティを他のスレッドからアクセスできるようにするには、クラスにフィールドを作成し、読み取り/書き込みごとに更新します。

private long _uploadedByteCount;

void SomeMethod()
{
    using (Stream output = File.OpenWrite("c:\temp\file.zip"))
    using (Stream input = file.InputStream)
    {
        byte[] buffer = new byte[8192];
        int bytesRead;
        while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            output.Write(buffer, 0, bytesRead);
            Interlocked.Add(ref _uploadedByteCount, bytesRead);
        }
    }
}

public long GetUploadedByteCount()
{
    return _uploadedByteCount;
}
于 2012-10-17T06:40:48.600 に答える