Skip to main content
 首页 » 编程设计

c#之如何从 Web API 2 HttpGet 发送 zip 文件

2024年02月05日29lvdongjie

我正在尝试弄清楚如何从给定的文件夹路径创建新的 zip 文件,并将其发送回发件人。

需要的是文件将被下载到请求它的发件人处。 我看过很多答案,但没有一个能帮助我找到确切的答案。

我的代码:

Guid folderGuid = Guid.NewGuid(); string folderToZip = ConfigurationManager.AppSettings["folderToZip"] + folderGuid.ToString();

Directory.CreateDirectory(folderToZip);

string directoryPath = ConfigurationManager.AppSettings["DirectoryPath"]; string combinedPath = Path.Combine(directoryPath, id);

DirectoryInfo di = new DirectoryInfo(combinedPath); 如果(di.Exists) { //提供要创建的 zip 文件的路径和名称 字符串 zipFile = folderToZip + "\"+ folderGuid + ".zip";

//call the ZipFile.CreateFromDirectory() method 
ZipFile.CreateFromDirectory(combinedPath, zipFile, CompressionLevel.Fastest, true); 
 
var result = new HttpResponseMessage(HttpStatusCode.OK); 
using (ZipArchive zip = ZipFile.Open(zipFile, ZipArchiveMode.Read)) 
{ 
    zip.CreateEntryFromFile(folderFiles, "file.zip"); 
} 
 
var stream = new FileStream(zipFile, FileMode.Open); 
result.Content = new StreamContent(stream); 
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
{ 
    FileName = "file.zip" 
}; 
log.Debug("END ExportFiles()"); 
return ResponseMessage(result); 

请您参考如下方法:

在你的 Controller 中:

using System.IO.Compression.FileSystem; // Reference System.IO.Compression.FileSystem.dll 
 
[HttpGet] 
[Route("api/myzipfile"] 
public dynamic DownloadZip([FromUri]string dirPath) 
{ 
if(!System.IO.Directory.Exists(dirPath)) 
   return this.NotFound(); 
 
    var tempFile = System.IO.Path.Combine(System.IO.Path.GetTempPath(), Guid.NewGuid()); // might want to clean this up if there are a lot of downloads 
    ZipFile.CreateFromDirectory(dirPath, tempFile); 
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); 
    response.Content = new StreamContent(new FileStream(tempFile, FileMode.Open, FileAccess.Read)); 
    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
    response.Content.Headers.ContentDisposition.FileName = fileName; 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip"); 
 
  return response; 
} 

UPD:文件已存在的解决方法