ASP.NET WebAPI创建文件并保存以供下载后下载和删除

时间:2014-07-12 14:47:09

标签: jquery asp.net asp.net-mvc asp.net-web-api

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

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

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

      

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

  2.   
  3. 生成文件并保存在服务器上之后,该方法将以200 status响应并生成令牌(实际上是文件名)。
  4.   
  5. 我的jQuery ajax请求方法将进入success function,然后将IFrame的“src”属性附加到刚刚生成的文件的路径和标记。
  6.   
  7. 服务器将下载该文件并将其删除。
  8.      所以我的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
    }
    

1 个答案:

答案 0 :(得分:0)

在评论中@MikeCheel可能是关于如何构建它的,但是如果你打算构建服务器端解决方案

  

A)保存文件的正确服务器路径在哪里   生成? (AppData,customFolder ..)

外部世界无法访问的自定义文件夹。然后创建一个处理程序,根据url参数提供文件。 IE浏览器。 mywebsite.com/getFile?id=23434234或其他一些。在处理程序中,您可以轻松添加安全性和其他检查。它也会为C派上用场。

您当然可以使用可访问的自定义文件夹,但这通常不赞成

  

b)是否有最佳做法可以将令牌创建为文件名或只是   使用GUID很好吗?

没有真正的最佳实践,你希望它们不容易猜到。 Guid可以正常工作。

  

c)如何在下载后删除服务器中的文件?文件   任何其他用户都不会访问该文件,因为该文件是由   请求。所以这是一次性文件。

如果您使用上述处理程序,则可以提供该文件,然后将其删除。否则,您可能需要一个定期删除临时文件的进程。如果没有处理程序,我不确定如何跟踪文件实际上是一次下载的,或者是从未下载过,还是下载了100次。