在 .Net 中从服务器传输压缩文件
Transmitting Zipped file from server in .Net
我正在编写一个小型网络应用程序,部分功能是能够将日志从服务器下载到用户的文件系统。我能够压缩现有日志,但无法传输压缩文件夹。我在这里浏览了许多其他类似的问题,但还没有根据其中任何一个问题来解决它。
这是我目前正在尝试的代码:
.网络控制器
[HttpPost]
public ActionResult DownloadLogs()
{
string path = System.Configuration.ConfigurationManager.AppSettings["LogPath"];
try
{
Log.Information("Closing current logger. AudtiLog: {auditLog}", true);
Log.CloseAndFlush();
string startPath = path;
string zipPath = "C:\my_folder\result.zip";
string extractPath = path + "extract";
//deleting existing zips
if (System.IO.File.Exists(zipPath))
System.IO.File.Delete(zipPath);
if (System.IO.Directory.Exists(extractPath))
System.IO.Directory.Delete(extractPath, true);
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
FileInfo file = new FileInfo(zipPath);
using (FileStream filestream = new FileStream(zipPath, FileMode.Open))
{
return File(filestream, "application/zip", "ServerLogZip.zip");
}
}
catch (Exception ex)
{
Log.Error("Error occurred when downloading server logs. Error: {Error}; AuditLog: {auditLog}", ex.Message, true);
return Json(new { result = "error" });
}
}
Javascript
function DownloadLogs() {
$.ajax({
type: "POST",
url: "/ManageServer/DownloadLogs",
contentType: "application/zip",
success: function (response) {
alert("Success")
},
error: function (response) {
alert("Error");
}
});
}
每当我 运行 它时,它都会将日志压缩到一个文件夹中,成功地逐步执行代码的 Response
部分,但没有任何反应。我试过调试和单步执行代码,但还没有找到答案。我也尝试了 Response.WriteFile
方法。运气不好。
编辑
我已将代码更新为 return ActionResult
并 return 编辑了 File
。当前 return 从服务器收到 500 错误。
@mason 注意到您的代码有问题。您正在尝试 return 两件事,文件和状态。
应通过 HTTP return 代码检查操作状态。
您可以使用 IActionResult
接口作为 return 类型,这样您就可以正确处理事情。给方法一个 File
作为 return 类型,如果一切正常,它将 return 您的文件包含所有 headers 需要的。万一出现问题,你可以return一个BadRequest("Error Message")
;
File
return 类型接受一个 FileStream 作为参数,它将包含您的原始数据、文件的 Mime 类型和文件名
要做到这一点,请执行以下步骤
- 将方法 return 类型更改为
FileResult
- 创建一个变量,将您的文件内容作为流接收或使用
using
语句
- 创建一个
byte
数组来分配文件内容(如果你尝试return文件流你会得到一个文件关闭的错误,因为using语句在retun发生之前关闭了)
- Return这样的数据
return File(byteArray, "application/zip", "ServerLogZip.zip");
样本
try{
// Do things to prepare your file
using(FileStream filestream = new FileStream(zipPath,FileMode.Open))
{
byte[] zipBytes= new byte[filestream.Length];
filestream.Read(PhotoBytes, 0, PhotoBytes.Length);
return File(zipBytes, "application/zip", "ServerLogZip.zip");
}
}
catch(Exception ex){
return BadRequest("Something gone wrong: " + ex.Message);
}
我一直在想如何通过异步请求下载这个文件,但最终,我意识到也许你不需要这么复杂的解决方案。直接调用路由即可下载文件
function DownloadLogs() {
document.location = your_route;
}
为了正常工作,您还必须将 C# 方法的方法装饰器从 [HttpPost]
更改为 [HttpGet]
我正在编写一个小型网络应用程序,部分功能是能够将日志从服务器下载到用户的文件系统。我能够压缩现有日志,但无法传输压缩文件夹。我在这里浏览了许多其他类似的问题,但还没有根据其中任何一个问题来解决它。
这是我目前正在尝试的代码:
.网络控制器
[HttpPost]
public ActionResult DownloadLogs()
{
string path = System.Configuration.ConfigurationManager.AppSettings["LogPath"];
try
{
Log.Information("Closing current logger. AudtiLog: {auditLog}", true);
Log.CloseAndFlush();
string startPath = path;
string zipPath = "C:\my_folder\result.zip";
string extractPath = path + "extract";
//deleting existing zips
if (System.IO.File.Exists(zipPath))
System.IO.File.Delete(zipPath);
if (System.IO.Directory.Exists(extractPath))
System.IO.Directory.Delete(extractPath, true);
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
FileInfo file = new FileInfo(zipPath);
using (FileStream filestream = new FileStream(zipPath, FileMode.Open))
{
return File(filestream, "application/zip", "ServerLogZip.zip");
}
}
catch (Exception ex)
{
Log.Error("Error occurred when downloading server logs. Error: {Error}; AuditLog: {auditLog}", ex.Message, true);
return Json(new { result = "error" });
}
}
Javascript
function DownloadLogs() {
$.ajax({
type: "POST",
url: "/ManageServer/DownloadLogs",
contentType: "application/zip",
success: function (response) {
alert("Success")
},
error: function (response) {
alert("Error");
}
});
}
每当我 运行 它时,它都会将日志压缩到一个文件夹中,成功地逐步执行代码的 Response
部分,但没有任何反应。我试过调试和单步执行代码,但还没有找到答案。我也尝试了 Response.WriteFile
方法。运气不好。
编辑
我已将代码更新为 return ActionResult
并 return 编辑了 File
。当前 return 从服务器收到 500 错误。
@mason 注意到您的代码有问题。您正在尝试 return 两件事,文件和状态。
应通过 HTTP return 代码检查操作状态。
您可以使用 IActionResult
接口作为 return 类型,这样您就可以正确处理事情。给方法一个 File
作为 return 类型,如果一切正常,它将 return 您的文件包含所有 headers 需要的。万一出现问题,你可以return一个BadRequest("Error Message")
;
File
return 类型接受一个 FileStream 作为参数,它将包含您的原始数据、文件的 Mime 类型和文件名
要做到这一点,请执行以下步骤
- 将方法 return 类型更改为
FileResult
- 创建一个变量,将您的文件内容作为流接收或使用
using
语句 - 创建一个
byte
数组来分配文件内容(如果你尝试return文件流你会得到一个文件关闭的错误,因为using语句在retun发生之前关闭了) - Return这样的数据
return File(byteArray, "application/zip", "ServerLogZip.zip");
样本
try{
// Do things to prepare your file
using(FileStream filestream = new FileStream(zipPath,FileMode.Open))
{
byte[] zipBytes= new byte[filestream.Length];
filestream.Read(PhotoBytes, 0, PhotoBytes.Length);
return File(zipBytes, "application/zip", "ServerLogZip.zip");
}
}
catch(Exception ex){
return BadRequest("Something gone wrong: " + ex.Message);
}
我一直在想如何通过异步请求下载这个文件,但最终,我意识到也许你不需要这么复杂的解决方案。直接调用路由即可下载文件
function DownloadLogs() {
document.location = your_route;
}
为了正常工作,您还必须将 C# 方法的方法装饰器从 [HttpPost]
更改为 [HttpGet]