【问题标题】:ASP.NET WebAPI create file and save it for future download and delete after downloadASP.NET WebAPI 创建文件并保存以供将来下载并在下载后删除
【发布时间】:2014-09-03 01:02:55
【问题描述】:

我有一个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
}

【问题讨论】:

  • 你看过这个帖子吗?stackoverflow.com/a/9970672/426422
  • 是的,但我更喜欢我自己的实现,因为我可能会将它迁移到 ExtJS。
  • 为什么不检查插件代码并调整它?
  • 这是一个好方法,但我的问题更多的是关于服务器端。
  • 如果您这样做客户端,您将不需要物理文件。

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


【解决方案1】:

在 cmets @MikeCheel 关于如何构建它可能是正确的,但如果您打算构建服务器端解决方案

A) 我将在哪里保存文件的正确服务器路径 产生? (AppData、customFolder..)

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

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

b) 是否有任何最佳实践将令牌创建为文件名或只是 使用 GUID 可以吗?

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

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

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

【讨论】:

  • 我会在我的问题中完成答案。
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多