[英]Using ICSharpCode.SharpZipLib.Zip Subfolder in zip when its not supposed to be
[英]Compress the Files using ICSharpCode.SharpZipLib.Zip by fetching files from SQL File stream
我正在使用ICSharpCode.SharpZipLib.Zip壓縮文件並下載zip文件,這里使用SQL File流存儲任何類型的文件(任意數量的GB)。 然后,我如何從sql文件流中壓縮文件並下載...我嘗試了以下類似操作,它引發了一個異常“大小為845941,但我希望ICSharpCode.SharpZipLib.Zip.ZipOutputStream.CloseEntry( )”。如何解決此問題...
string zipFileName = "ZipName.zip";
Response.ContentType = "application/zip";
Response.AddHeader("content-disposition", "fileName=" + zipFileName);
byte[] buffer = new byte[4096];
ZipOutputStream zipOutputStream = new ZipOutputStream(Response.OutputStream);
zipOutputStream.SetLevel(3);
string cs = System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
foreach (Filec file1 in Files)
{
StreamModel model123 = new StreamModel();
const string SelectTSql = @"
SELECT FileData.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT(), FileType
FROM MyFiles WHERE FileId = @FileId";
using (TransactionScope ts = new TransactionScope())
{
using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(cs))
{
conn.Open();
using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(SelectTSql, conn))
{
cmd.Parameters.Add("@FileId", System.Data.SqlDbType.Int).Value = Convert.ToInt32(file1.FileId);
using (System.Data.SqlClient.SqlDataReader rdr = cmd.ExecuteReader())
{
rdr.Read();
model123.serverPath = rdr.GetSqlString(0).Value;
model123.serverTxn = rdr.GetSqlBinary(1).Value;
model123.filetype = rdr.GetSqlString(2).Value;
rdr.Close();
}
}
}
ZipEntry zipEntry = new ZipEntry(ZipEntry.CleanName(file1.FileName));
zipEntry.Size = model123.serverTxn.Length;
zipOutputStream.PutNextEntry(zipEntry);
byte[] buffer3 = new byte[4096];
using (System.Data.SqlTypes.SqlFileStream sfs = new System.Data.SqlTypes.SqlFileStream(model123.serverPath, model123.serverTxn, FileAccess.Read))
{
int bytesRead;
while ((bytesRead = sfs.Read(buffer3, 0, buffer3.Length)) > 0)
{
zipOutputStream.Write(buffer3, 0, bytesRead);
}
sfs.Close();
}
zipOutputStream.CloseEntry(); // at this line throwing an exception.
ts.Complete();
}
}
zipOutputStream.Close();
Response.Flush();
Response.End();
在理解了每一行代碼之后,我想出了解決方案。
1)“ zipEntry.Size = model123.serverTxn.Length;” 這行引起異常,因為“大小為845941,但我預期為16”。因為“ model123.serverTxn.Length”不是文件的完整大小,所以我將其更改為“ sfs.Length”,即SqlFileStream長度。
2)zipOutputStream級別最大設置為“ zipOutputStream.SetLevel(9)”,因為,我在這里像視頻一樣壓縮大型文件。
3)而且TransactionScope必須更大,否則,將不下載完整文件(大於500mb的大文件),因此下載后我們將看到文件損壞的錯誤消息。
string zipFileName = "ZipName.zip";
Response.ContentType = "application/zip";
Response.AddHeader("content-disposition", "fileName=" + zipFileName);
byte[] buffer = new byte[4096];
ZipOutputStream zipOutputStream = new ZipOutputStream(Response.OutputStream);
zipOutputStream.SetLevel(9); // Point 2
try
{
string cs = System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
foreach (Filec file1 in Files)
{
StreamModel model123 = new StreamModel();
const string SelectTSql = @"SELECT FileData.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT(), FileType
FROM MyFiles WHERE FileId = @FileId";
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { Timeout = TimeSpan.FromDays(1) })) // Point 3
{
using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(cs))
{
conn.Open();
using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(SelectTSql, conn))
{
cmd.Parameters.Add("@FileId", System.Data.SqlDbType.Int).Value = Convert.ToInt32(file1.FileId);
using (System.Data.SqlClient.SqlDataReader rdr = cmd.ExecuteReader())
{
rdr.Read();
model123.serverPath = rdr.GetSqlString(0).Value;
model123.serverTxn = rdr.GetSqlBinary(1).Value;
model123.filetype = rdr.GetSqlString(2).Value;
rdr.Close();
}
}
}
using (System.Data.SqlTypes.SqlFileStream sfs = new System.Data.SqlTypes.SqlFileStream(model123.serverPath, model123.serverTxn, FileAccess.Read))
{
ZipEntry zipEntry = new ZipEntry(ZipEntry.CleanName(file1.FileName));
zipEntry.Size = sfs.Length; // Point 1
zipOutputStream.PutNextEntry(zipEntry);
int bytesRead;
while ((bytesRead = sfs.Read(buffer, 0, buffer.Length)) > 0)
{
if (!Response.IsClientConnected)
{
break;
}
zipOutputStream.Write(buffer, 0, bytesRead);
Response.Flush();
}
sfs.Close();
}
ts.Complete();
}
zipOutputStream.CloseEntry();
}
zipOutputStream.Finish();
zipOutputStream.Close();
Response.Flush();
Response.End();
}
catch (Exception ex)
{
TempData["ErrorMessage"] = "Oohhhh! Exception Occured(Error)...";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.