2

私は最大1GBのファイルのアップロードを許可するWebサイトを持っており、現時点ではファイルをFilestreamに読み取り、バイナリコンテンツとしてMSSQLデータベースに書き込みます。

これはますます大量のリソースを消費していることがわかったので、ファイルを「チャンク」して4MBのチャンクになるように調査しました。

私はそれを持っているので、チャンクはデータベースに送られますが、FileUploadコントロールからFileStreamにアップロードするのに比べて、アップロードに2倍の時間がかかります。その後、データベースへのチャンクでの書き込みが開始されます。

理想的には、FileUploadから直接チャンク化して、4mbがInputStreamにあるときに、データベースへの書き込みを開始するようにします。これが私がこれまでにテストしたものです:

        Stream fs = FileUpload.PostedFile.InputStream;

        int BUFFER_SIZE = 4000;
        byte[] chunk = new byte[BUFFER_SIZE];

        SqlConnection connection = new  SqlConnection(ConfigurationSettings.AppSettings["SQLConnection"]);
        connection.Open();
        SqlCommand cmd = new SqlCommand("UPDATE TABLENAME SET Content.WRITE(@data, NULL, 0) WHERE ID ='" + DocID + "'", connection);

        SqlParameter dataParam = cmd.Parameters.Add("@data", SqlDbType.VarBinary); // remaining as Update.WRITE
        SqlParameter lengthParam = cmd.Parameters.Add("@length", SqlDbType.Int);

        int cIndex = 0;
        int readBytes = 0;
        int fileSize = System.Convert.ToInt32(fs.Length);

        while (cIndex < fileSize)
        {
            if (cIndex + BUFFER_SIZE > fileSize)
                readBytes = fileSize - cIndex;
            else
                readBytes = BUFFER_SIZE;
            fs.Read(chunk, 0, readBytes);

            dataParam.Value = chunk;
            dataParam.Size = readBytes;
            lengthParam.Value = readBytes;

            cmd.ExecuteNonQuery();

            cIndex += BUFFER_SIZE;
        }

したがって、明確にするために、PostedFileがファイルを完全にアップロードしてから、DBへの送信を開始するのを待っています。

  FileUpload.PostedFile.InputStream;

誰かが私を正しい方向に向けることができますか?

どうもありがとう。

4

1 に答える 1

0

FileUpload コントロールの動作方法により、これは Web ブラウザー経由では実行できないと思います (ソースに見られるように、要求からファイル file を取得します)。

public System.Web.HttpPostedFile PostedFile
{
    get
    {
        if !(this.Page == null) && (this.Page.IsPostBack) 
        {
            return this.Context.Request.Files.Item(this.UniqueID);
        }
        return null;
    }
}

次の手順を使用して、ネイティブクライアントを使用してこの作業を行ったことがあります。

クライアント:

  • アップロード トークンを取得する
  • チャンクのアップロードを開始します(好みのサイズですが、最大ファイルサイズ/ 10をお勧めします。これにより、アップロードされた量についてユーザーにフィードバックを与えることができます)

サーバ:

  • トークンを提供し、辞書に保存するか、同様に保存します
  • 受信したチャンクを、トークンを名前としてファイルに追加します
  • ファイル/チャンクが正しく到着したかどうかを返す

これが何らかの形で役立つことを願っています:)。

于 2012-12-07T09:50:19.013 に答える