Javascript 什么';下载php生成的文件的最佳方式是什么?

Javascript 什么';下载php生成的文件的最佳方式是什么?,javascript,php,jquery,Javascript,Php,Jquery,我正在使用jquery$.post请求生成一个gpx文件。post请求然后返回文件保存时使用的唯一id。现在我想下载这个文件,但将文件的名称从唯一id更改为用户在输入div中指定的名称 我一直在研究,似乎这是不可能使用另一个post请求发送名称数据 我无法使用location.href,因为文件名需要更改,我需要在下载请求中发送新名称 如何解决这个问题?您可以使用php rename()函数。通过另一个post请求,您可以传递唯一的名称和用户选择的名称。重命名文件并将其名称作为响应发送。然后,使

我正在使用jquery$.post请求生成一个gpx文件。post请求然后返回文件保存时使用的唯一id。现在我想下载这个文件,但将文件的名称从唯一id更改为用户在输入div中指定的名称

我一直在研究,似乎这是不可能使用另一个post请求发送名称数据

我无法使用location.href,因为文件名需要更改,我需要在下载请求中发送新名称

如何解决这个问题?

您可以使用php rename()函数。通过另一个post请求,您可以传递唯一的名称和用户选择的名称。重命名文件并将其名称作为响应发送。然后,使用jQuery,您可以对响应执行任何操作。所以它是:

  • 使用rename()函数向php脚本发送唯一名称和新名称
  • 让脚本重命名文件,并将新名称作为$.post响应发送
  • 使用jQuery可以对响应执行任何操作
  • 我无法使用location.href,因为文件名需要更改,我需要在下载请求中发送新名称

    是的,你可以

    只需不发送文件名位置,而是发送PHP脚本的位置,该脚本将检索正确的文件,无论其名称如何(例如,唯一),然后检索正确的本地名称(例如,从$会话),并发送适当的头:

    header('Content-Type: application/pdf;charset=UTF-8');
    header('COntent-Disposition: attachment; filename="MyStrangeName.pdf"');
    header('Content-Length: ' . filesize($realFile));
    readfile($realFile);
    
    这还允许您通过$\u会话确定下载程序确实有权下载文件

    对于非常大的文件量,我建议您采用uniquename plus文件树解决方案,例如a la Squid

    uniqueid = 4fd3ea17 // Unique file ID
    file     = downloads/4f/d3/4fd3ea17
    
    因此,每个目录最多只包含65536个文件

    然后在mod rewrite的帮助下,您可以发送

    Location: http://www.yoursite.com/download/4fd3ea17
    

    (不要忘记拒绝对下载目录的直接访问和索引)

    为什么不在初始post请求中发送名称,并以正确的名称创建文件?因为我想防止在使用不同用户创建大量不同文件时意外覆盖文件。我想我只是要为文件创建一个唯一的文件夹,并在第一次将其命名为:)谢谢你可以这样做,为每个用户创建一个文件夹等等。另一个选项,我更喜欢的方法是在文件名的末尾附加一个时间戳。时间戳是个好主意,我没想到。谢谢这可能是一个奇怪的问题(因为我不知道你的项目,你也没有提供多少信息),但是,为什么你不用文件名而不是文件名来回答呢?使用@LSerni的答案并立即将文件返回给客户端,而不是触发获取文件请求的ID?在将文件返回给客户端之前,您可以将文件名更改为您想要的任何名称。另外,使用
    $.post
    向服务器发送数据(并获取响应),使用
    $.get
    向服务器请求数据(作为响应)。当然,您可以使用
    $.ajax
    并在参数中指定类型。是的,这很有意义,但我不知道他是否希望使用唯一的id上载它,然后更改文件名。他问我如何给它重新命名,我告诉他怎么命名。如果他真的想要一个唯一的id,那么创建一个具有唯一id的目录并将正确命名的文件存储在其中是有意义的。这很公平,但是您的方法实际上会重命名该文件,并给出与正确命名文件完全相同的结果。现在,如果您的方法生成了一个类似于
    copy($file,$newfile)
    的文件副本,那么它将更有意义(将原始文件保留在唯一id下,以便稍后再次使用)