我有一个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
}
在评论中,@MikeCheel可能对如何构建它是正确的,但如果您打算构建服务器端解决方案
A( 保存我要保存的文件的正确服务器路径在哪里生成(AppData,customFolder..(
外部世界无法访问的自定义文件夹。然后创建一个处理程序,根据url参数提供文件。IE.mywebsite.com/getFile?id=23434234或一些这样的。在处理程序中,您可以轻松地添加安全性和其他检查。它也将派上用场的C.
你当然可以选择一个可访问的自定义文件夹,但这通常是不赞成的
b( 是否有将令牌创建为文件名的最佳实践使用GUID可以吗?
没有真正的最佳实践,你希望它们不容易被猜测。Guid会很好用。
c( 下载后如何删除服务器中的文件?文件不会被任何其他用户访问,因为该文件是由要求所以这是一个一次性文件。
如果你使用上面的处理程序,你可以提供文件,然后删除它。否则,你可能需要一个定期删除临时文件的进程。如果没有处理程序,我不知道如何跟踪文件是否真的下载了一次,或者它是否从未下载过,或者下载了100次。