我有一个ASP.NET WebAPI
项目,我需要根据客户端(jQuery
)请求生成XLS或PDF。
因为无法使用$.ajax
下载文件,所以方法非常简单:
$.ajax
请求在服务器上生成文件(XLS或PDF)。
但不是从服务器向客户端发送响应,而是在本地保存文件。文件名为: some_token.xls 。令牌应该是唯一的。也许是一个GUID。
200 status
响应并生成令牌(实际上是文件名)。jQuery
ajax请求方法将进入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
}
答案 0 :(得分:0)
在评论中@MikeCheel可能是关于如何构建它的,但是如果你打算构建服务器端解决方案
A)保存文件的正确服务器路径在哪里 生成? (AppData,customFolder ..)
外部世界无法访问的自定义文件夹。然后创建一个处理程序,根据url参数提供文件。 IE浏览器。 mywebsite.com/getFile?id=23434234或其他一些。在处理程序中,您可以轻松添加安全性和其他检查。它也会为C派上用场。
您当然可以使用可访问的自定义文件夹,但这通常不赞成
b)是否有最佳做法可以将令牌创建为文件名或只是 使用GUID很好吗?
没有真正的最佳实践,你希望它们不容易猜到。 Guid可以正常工作。
c)如何在下载后删除服务器中的文件?文件 任何其他用户都不会访问该文件,因为该文件是由 请求。所以这是一次性文件。
如果您使用上述处理程序,则可以提供该文件,然后将其删除。否则,您可能需要一个定期删除临时文件的进程。如果没有处理程序,我不确定如何跟踪文件实际上是一次下载的,或者是从未下载过,还是下载了100次。