시나리오 : 최근 ASP.NET MVC 응용 프로그램에 파일을 데이터베이스에 업로드 할 수있는 구성 요소를 추가했습니다. 이러한 파일의 평균 크기가 2MB를 넘기 때문에 FILESTREAM을 사용하기로 결정했습니다. HttpPostedFileBase
을 임시 파일에 저장하고 비즈니스 로직을 수행 한 다음 파일을 업로드합니다. 업로드가 끝나면 브라우저에서 파일을 볼 수있는 페이지로 사용자가 리디렉션됩니다. 아름답게SQL FILESTREAM breaking
public partial class File
{
public SqlFileStream Open(DocumentEntities db, FileAccess access)
{
var path = db.Database.SqlQuery<string>(
@"SELECT FileData.PathName() FROM [File] WHERE DocumentID = @docID",
new SqlParameter("docID", DocumentID)).First();
var context = db.Database.SqlQuery<byte[]>(
@"SELECT Get_FILESTREAM_TRANSACTION_CONTEXT() FROM [File] WHERE DocumentID = @docID",
new SqlParameter("docID", DocumentID)).First();
return new SqlFileStream(path, context, access);
}
}
이전에 업로드 된 파일을보기 작품 : 여기에
var DocContext = new DocumentEntities();
var dbFile = new File
{
DocumentID = Guid.NewGuid(),
Name = fileName,
Type = file.ContentType
};
DocContext.Document.Add(dbFile);
DocContext.SaveChanges();
using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
using (var sqlFS = dbFile.Open(DocContext, FileAccess.Write))
using (var tempFS = tempFile.OpenRead())
{
tempFS.CopyTo(sqlFS);
scope.Complete();
}
관련보기/다운로드 코드 :
public ActionResult File(Guid? id = null)
{
if (id == null)
return RedirectToActionPermanent("Index");
return File(DocContext.Document.Find(id.Value) as File);
}
private ActionResult File(File file)
{
if (file == null)
throw new HttpException(404, "Unknown document type");
var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead });
Disposing += d => { scope.Complete(); scope.Dispose(); };
var fs = file.Open(DocContext, FileAccess.Read);
Disposing += d => fs.Dispose();
return new Misc.InlineFileStreamResult(fs, file.MimeType) { FileDownloadName = file.FileName, Inline = true };
}
그리고 열기 방법을 여기에 관련 업로드 코드는 . 사용자가 업로드 한 파일 (최근?)을 보면 다음과 같은 예외가 발생합니다. The transaction operation cannot be performed because there are pending requests working on this transaction.
무슨 일 이죠?
업데이트 : 나는 SQL 시스템 관리자이기 때문에 파일을 업로드하고 잘 볼 수 있다고 가정합니다.