私は最大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;
誰かが私を正しい方向に向けることができますか?
どうもありがとう。