ASP.NET WebAPI创建文件并保存以备将来下载,并在下载后删除



我有一个ASP.NET WebAPI项目,需要根据客户端(jQuery(的请求生成XLS或PDF。

因为使用$.ajax无法下载文件,所以方法非常简单:

  1. 我将通过$.ajax请求在服务器上生成文件(XLS或PDF(。

    但我将在本地保存该文件,而不是将响应从服务器发送到客户端。文件名将为:some_token.xls。令牌应该是唯一的。也许是GUID

  2. 文件生成并保存在服务器上后,该方法将使用200 status和刚刚生成的令牌(实际上是文件名(进行响应
  3. 我的jQuery ajax请求方法将进入success function,然后将IFrame的"src"属性与刚刚生成的文件的路径和令牌附加在一起
  4. 服务器将下载该文件并将其删除
所以我的jQuery ajax看起来是这样的:
 $.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次。

最新更新