Estoy tratando de crear archivos zip dinámicamente en el servidor que incluye fotos de servicios en línea. Pero cuando intento abrir el archivo, WinRar dice que el archivo es un formato desconocido o está dañado.Creando zip en C# con System.IO.Packaging
este es el código:
MemoryStream stream = new MemoryStream();
Package package = ZipPackage.Open(stream, FileMode.Create, FileAccess.ReadWrite);
foreach (Order o in orders)
{
o.GetImages();
Parallel.ForEach(o.Images, (Dictionary<string, object> image) =>
{
string imageId = (string)image["ID"];
int orderId = (int)image["OrderId"];
string fileName = (string)image["FileName"];
string url = (string)image["URL"];
if (string.IsNullOrEmpty(fileName))
{
System.Net.WebClient wc = new System.Net.WebClient();
byte[] data = wc.DownloadData(url);
MemoryStream ms = new MemoryStream(data);
ms.Write(data, 0, data.Length);
string ext;
switch(wc.ResponseHeaders["Content-Type"])
{
case "image/jpeg":
case "image/jpg":
ext = "jpg";
break;
case "image/png":
ext = "png";
break;
case "image/gif":
ext = "gif";
break;
default :
ext = "un";
break;
}
Uri uri = new Uri("/" + orderId.ToString() + "/" + imageId + "." + ext, UriKind.Relative);
var part = package.CreatePart(uri, wc.ResponseHeaders["Content-Type"], CompressionOption.NotCompressed);
var pstream = part.GetStream(FileMode.Open, FileAccess.ReadWrite);
pstream.Write(data, 0, data.Length);
var rel = package.CreateRelationship(part.Uri, TargetMode.Internal, "http://example.com/AlbumImage");
}
});
}
package.Flush();
byte[] fileBytes = new byte[stream.Length];
stream.Read(fileBytes, 0, Convert.ToInt32(stream.Length));
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=Orders.zip");
Response.AddHeader("Content-Length", stream.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(fileBytes);
Response.End();
Has probado esto con una sola orden con una imagen? ¿Has intentado utilizar un 'foreach' común en lugar de' Parallel.ForEach'? ¿El subproceso 'Package' está seguro en la llamada a' CreatePart'? Parece que vas a escribir en la transmisión desde múltiples hilos, y a menos que 'CreatePart' sea seguro para los hilos, entonces obtendrás una transmisión dañada. –
Lo he estado haciendo ahora en una sola imagen, por lo que la seguridad del hilo no debería ser un problema aquí – aikixd
Probado con foreach común. no hay cambios – aikixd