【发布时间】:2014-09-03 01:02:55
【问题描述】:
我有一个ASP.NET WebAPI 项目,我需要根据客户 (jQuery) 请求生成 XLS 或 PDF。
因为无法使用$.ajax 下载文件,所以方法很简单:
- 我将通过
$.ajax请求在服务器上生成文件(XLS 或 PDF)。但是我不会将响应从服务器发送到客户端,而是将文件保存在本地。文件名将是:some_token.xls。令牌应该是唯一的。也许是一个 GUID。
- 文件生成并保存到服务器后,该方法将返回一个
200 status和刚刚生成的令牌(实际上是文件名)。 - 我的
jQueryajax 请求方法将进入success function,然后将IFrame 的“src”属性附加到刚刚生成的文件的路径和令牌。 - 服务器将下载文件并将其删除。
$.ajax({
// the url used to generate the file and save it on server
url: '/api/requestfile',
contentType: "application/json; charset=utf-8",
data: myData,
dataType: "json",
cache: false,
type: 'POST',
success: function (data) {
if (data) {
// if the file was created successfuly on server then download the file
var iframe = $("<iframe/>").attr({
src: 'api/downloadfile/' + data.filetoken, // filetoken generated in server
style: "visibility:hidden;display:none"
}).appendTo(buttonToDownloadFile);
} else {
alert('Something went wrong');
}
}
})
所以我有几个问题:
a) 保存我将生成的文件的正确服务器路径在哪里? (AppData、customFolder..?
b) 是否有任何最佳做法可以将令牌创建为文件名或仅使用 GUID?
c) 下载后如何删除服务器中的文件?该文件不会被任何其他用户访问,因为该文件是由请求创建的。所以这是一个一次性文件。
更新的解决方案:
a) 解决方案是在 App_Data 文件夹中创建一个“TempFiles”目录,用于存储数据。
b) 我创建了一个随机函数来生成令牌:
public static string GetRandomToken(int length) {
int intZero = '0';
int intNine = '9';
int intA = 'A';
int intZ = 'Z';
int intCount = 0;
int intRandomNumber = 0;
string strDownloadToken = "";
Random objRandom = new Random(System.DateTime.Now.Millisecond);
while (intCount < length) {
intRandomNumber = objRandom.Next(intZero, intZ);
if (((intRandomNumber >= intZero) &&
(intRandomNumber <= intNine) ||
(intRandomNumber >= intA) && (intRandomNumber <= intZ))) {
strDownloadToken = strDownloadToken + (char) intRandomNumber;
intCount++;
}
}
return strDownloadToken;
}
c) 因为我使用的是 WebAPI,所以删除有点不同。我必须创建一个过滤器:
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
// here I added the code to delete the file.
// this Filter is executed after the file response have been sent to server so its safe now to delete the file
}
【问题讨论】:
-
你看过这个帖子吗?stackoverflow.com/a/9970672/426422
-
是的,但我更喜欢我自己的实现,因为我可能会将它迁移到 ExtJS。
-
为什么不检查插件代码并调整它?
-
这是一个好方法,但我的问题更多的是关于服务器端。
-
如果您这样做客户端,您将不需要物理文件。
标签: jquery asp.net asp.net-mvc asp.net-web-api