ASP.Net 框架 4.7 的问题。 Return 文件。没有下载提示
Problem with ASP.Net framwork 4.7. Return file. No download prompt
我正在制作一个控制器,用于 return 基于数据库中模型的文件,但我在获取下载文件的提示时遇到问题。控制器看起来像这样 atm:
public ActionResult CreateFile(string ID)
{
int id = int.Parse(licneseFileID);
File_Type file = db.Files.FirstOrDefault(li => li.ID == id);
string fileName = Path.Combine(Server.MapPath(@"~\App_Data\TempData"), file.NAME.Replace(" ", string.Empty) + ".lic");
WriteFile(fileName) //Here the file is created and its content is writen based on the data model
ProcessStartInfo startInfo = new ProcessStartInfo(Server.MapPath(@"~\rlmsign12.exe"), fileName);
Process.Start(startInfo); //im runnig a 3rd party .exe to sign the file for licensing
try
{
Debug.WriteLine("Works?");
return File(fileName, MimeMapping.GetMimeMapping(fileName), System.IO.Path.GetFileName(fileName)); //The problem is here. Getting no download when it runs. filename is a full path.
}
catch (Exception)
{
Debug.WriteLine("Fail");
throw;
}
finally
{
//send file to blob here if we are going to be using a blob.
//System.IO.File.Delete(fileName); //Delete file from application to avoid filling it upp with files. Send to local storage? Extra backup
}
}
解释一下。
从数据库中获取文件
将路径保存到“文件名”。
运行 它通过在App_Data 的子文件夹中创建文件然后写入文件内容的方法。
使用第 3 方软件签署文件。
将文件发送给用户。 <-这就是问题所在。
删除文件
所以问题是当我 运行 控制器没有通过客户端收到下载提示时。
我知道 return 语句不会失败,因为它不会抛出异常。我检查了下载,没有任何内容。
我尝试关闭 chrome 安全性。
我试过 return 文件作为字节数组。我也尝试了一些不同的内容类型。
我是否遗漏了一些明显的东西,比如方法的属性?
该方法目前 运行 直接由控制器中的索引方法 class (带有硬编码参数)用于测试目的。
编辑:
IE 在加载页面时调用它。
public ActionResult Index()
{
CreateFile("2");
return View(db.LICENSE_FILES.ToList());
}
Peter B 的评论提出了一些非常明显的问题。我在视图 returned 之前调用该方法。从我写的时候遗留下来的。
编辑 2:
尝试使用 Jquery:
调用操作
<script>
function call()
{
$.ajax
({
url: '/LicenseFiles/CreateFile',
data: { licneseFileID: "2" }
})
.done(function ()
{
alert('test');
})
}
我可以在网络选项卡中调用该操作,但我没有收到保存文件的提示,也没有下载任何内容。
您的第一次尝试(从 Index
调用 CreateFile
)不会成功,您似乎已经明白原因了。相反,将 重定向 到 CreateFile
会起作用,但是文件下载将是对 Index
调用的最终响应,并且没有新的将显示视图。
第二次尝试无效,因为下载只有在浏览器完成请求时才会“发生”window。使用 $.ajax
时,发出请求的是 XMLHttpRequest
对象,它将接收数据,然后由您提取数据,例如将它变成一个 Blob 以供下载 - 不是很容易或方便。
一个更简单的解决方案是:
window.location = "/CreateFile/2";
或可能(取决于您的路由):
window.location = "/CreateFile?id=2";
我正在制作一个控制器,用于 return 基于数据库中模型的文件,但我在获取下载文件的提示时遇到问题。控制器看起来像这样 atm:
public ActionResult CreateFile(string ID)
{
int id = int.Parse(licneseFileID);
File_Type file = db.Files.FirstOrDefault(li => li.ID == id);
string fileName = Path.Combine(Server.MapPath(@"~\App_Data\TempData"), file.NAME.Replace(" ", string.Empty) + ".lic");
WriteFile(fileName) //Here the file is created and its content is writen based on the data model
ProcessStartInfo startInfo = new ProcessStartInfo(Server.MapPath(@"~\rlmsign12.exe"), fileName);
Process.Start(startInfo); //im runnig a 3rd party .exe to sign the file for licensing
try
{
Debug.WriteLine("Works?");
return File(fileName, MimeMapping.GetMimeMapping(fileName), System.IO.Path.GetFileName(fileName)); //The problem is here. Getting no download when it runs. filename is a full path.
}
catch (Exception)
{
Debug.WriteLine("Fail");
throw;
}
finally
{
//send file to blob here if we are going to be using a blob.
//System.IO.File.Delete(fileName); //Delete file from application to avoid filling it upp with files. Send to local storage? Extra backup
}
}
解释一下。
从数据库中获取文件
将路径保存到“文件名”。
运行 它通过在App_Data 的子文件夹中创建文件然后写入文件内容的方法。 使用第 3 方软件签署文件。
将文件发送给用户。 <-这就是问题所在。
删除文件
所以问题是当我 运行 控制器没有通过客户端收到下载提示时。 我知道 return 语句不会失败,因为它不会抛出异常。我检查了下载,没有任何内容。
我尝试关闭 chrome 安全性。
我试过 return 文件作为字节数组。我也尝试了一些不同的内容类型。
我是否遗漏了一些明显的东西,比如方法的属性?
该方法目前 运行 直接由控制器中的索引方法 class (带有硬编码参数)用于测试目的。
编辑: IE 在加载页面时调用它。
public ActionResult Index()
{
CreateFile("2");
return View(db.LICENSE_FILES.ToList());
}
Peter B 的评论提出了一些非常明显的问题。我在视图 returned 之前调用该方法。从我写的时候遗留下来的。
编辑 2: 尝试使用 Jquery:
调用操作<script>
function call()
{
$.ajax
({
url: '/LicenseFiles/CreateFile',
data: { licneseFileID: "2" }
})
.done(function ()
{
alert('test');
})
}
我可以在网络选项卡中调用该操作,但我没有收到保存文件的提示,也没有下载任何内容。
您的第一次尝试(从 Index
调用 CreateFile
)不会成功,您似乎已经明白原因了。相反,将 重定向 到 CreateFile
会起作用,但是文件下载将是对 Index
调用的最终响应,并且没有新的将显示视图。
第二次尝试无效,因为下载只有在浏览器完成请求时才会“发生”window。使用 $.ajax
时,发出请求的是 XMLHttpRequest
对象,它将接收数据,然后由您提取数据,例如将它变成一个 Blob 以供下载 - 不是很容易或方便。
一个更简单的解决方案是:
window.location = "/CreateFile/2";
或可能(取决于您的路由):
window.location = "/CreateFile?id=2";