我正在尝试从服务器上下载一组文件作为zip文件。在本地我完全可以做到,但现在我在windows Server2019(IIS)中部署了应用程序,当我尝试下载文件时,我会发现404-文件或目录找不到。
为了以zip的形式下载这组文件,我使用了SharpZipLib库。文件路径都是正确的,我可以通过服务器中的文件系统访问它们。
首先,我将文件上传到发布应用程序的wwwroot中的一个文件夹中。我在wwwroot中的文件夹的结构是:
我以zip方式下载文件的方法:
public async Task<FileResult> DownloadZipAsync() {
List<string> filePaths = //linq query to get the file paths.
//Example of file path: C:\inetpub\wwwroot\SRO\wwwroot\docs\contracts\testing.pdf
var name = "contracts";
var webRoot = _hostingEnvironment.WebRootPath;
var fileName = name + ".zip";
var tempOutput = webRoot + "\\docs\\contracts\\" + fileName;
using (ZipOutputStream zipOutputStream = new ZipOutputStream(System.IO.File.Create(tempOutput))) {
zipOutputStream.SetLevel(9);
byte[] buffer = new byte[4096];
for (int index = 0; index < filePaths.Count; index++) {
ZipEntry entry = new ZipEntry(name + "\\" + Path.GetFileName(filePaths[index]));
entry.DateTime = DateTime.Now;
entry.IsUnicodeText = true;
zipOutputStream.PutNextEntry(entry);
using (FileStream fileStream = System.IO.File.OpenRead(filePaths[index])) {
int sourceBytes;
do {
sourceBytes = fileStream.Read(buffer, 0, buffer.Length);
zipOutputStream.Write(buffer, 0, sourceBytes);
} while (sourceBytes > 0);
}
}
zipOutputStream.Finish();
zipOutputStream.Flush();
zipOutputStream.Close();
}
byte[] finalReuslt = System.IO.File.ReadAllBytes(tempOutput);
if (System.IO.File.Exists(tempOutput)) {
System.IO.File.Delete(tempOutput);
}
if (finalReuslt == null && !finalReuslt.Any()) {
throw new Exception(String.Format("Nothing found"));
}
return File(finalReuslt, "application/zip", fileName);
}
我试图解决的问题有:
也许我的下载方法在部署时工作不正常。我怀疑问题可能在using语句中,特别是在system.io.file.create()方法中。
通过Visual Studio for ASP.NET Core中的开发时IIS支持,我在本地开发计算机上“部署”了该应用程序。链接
我做了上面提到的同样的三个步骤,在本例中它是有效的,有一点不同的是文件的路径不同(因为我的应用程序是在本地‘部署’的),它们指向我的C:/。。。。目录。
如果你能帮我的话,我将不胜感激,因为我在这个问题上陷了很长一段时间了。谢谢
你检查了默剧类型了吗?
尝试添加
。zip-应用程序/zip
或
。zip-application/x-zip