如何在新选项卡中打开时重命名保存在服务器上的pdf

Posted

技术标签:

【中文标题】如何在新选项卡中打开时重命名保存在服务器上的pdf【英文标题】:How to rename pdf which saved on Server while opening in new tab 【发布时间】:2019-09-10 11:13:15 【问题描述】:

我正在编写一个 Web 应用程序,除其他外,它允许用户将文件上传到我的服务器。为了防止名称冲突和组织文件,我将它们放在我的服务器上后重命名。

我的问题是,有没有办法指定要下载的文件的名称。?因此,用户上传了一个名为“abc.pdf”的文件,我将其重命名为“10.pdf”,但是当他们下载它时,我希望浏览器默认将文件保存为“abc.pdf”。有什么办法吗?

我提到了这个问题

How to set name of file downloaded from browser?

但在我的情况下,我在 javascript 的新选项卡中打开 pdf。当点击 pdf 将获得与存储在服务器中的名称相同的 id,该 id 将引用 DB 并使用 ajax 获取实际名称。但是如何将文件名从 id 重命名为实际名称?

    $(document).on('click', '.file', function (e)  
    var id = this.id+'.pdf';
    $.ajax(
                url: "<?php echo base_url() ?>/Directorylist/files",
                        type: "POST",
                        datatype: 'json',
                        success: function (data)   
    var actual_name = data; 
    var win = window.open();                    
win.location.href="http://localhost:8080/panExplorer/uploads/"+id+"";
                        ,
                );
    );

【问题讨论】:

答案是一样的,你需要重定向到服务器脚本并将标头放入该脚本中。重定向的触发方式无关紧要。 你能解释一下吗,我只是初学者。 您可以使用"http://localhost:8080/panExplorer/download.php?file=id" 并在download.php 中写入您的标题并从uploads 目录读取pdf 文件。而且我只用 JavaScript 添加了答案。 【参考方案1】:

您可以尝试创建一个标签将其附加到正文(它在 chrome 中没有这个但它需要在 Firefox 中的文档中)并点击它,(您需要调用本机点击而不是 jQuery 方法)。

function download(url, fname) 
    var a = $('<a/>').attr(
      href: url,
      download: fname,
      target: '_blank'
    ).appendTo('body');
    a[0].click(); // native DOM function
    a.remove();

而不是

var win = window.open();
win.location.href="http://localhost:8080/panExplorer/uploads/"+id+"";

使用:

download("http://localhost:8080/panExplorer/uploads/" + id, "some_other.pdf");

编辑

另一种解决方案是创建 php 文件,该文件将作为下载文件的代理,您使用相同的代码但转发到 php 文件:

var win = window.open();
win.location.href="http://localhost:8080/panExplorer/download.php?file="+id;

在您使用的download.php 文件中:

// and you should check if there are no ".." in the filename,
// so no one will download your source code with `file=../index.php`
readfile("./upload/" . $_GET['file']); 

并使用解决方案从How to set name of file downloaded from browser?下载文件

编辑

如果你需要打开文件但这里没有下载是解决办法:

您需要具有正确名称的 url,因此它需要以 /filename.pdf 结尾,最简单的方法是使用如下所示的 url:

  /UploadFiles/id/your_filename.pdf

并且您需要编写脚本(或在您的框架中路由)将打开 id 并忽略文件名,文件名将被浏览器使用。

【讨论】:

@stevin 我假设您要下载文件,这样您就需要使用 htaccess 转发文件的第二种解决方案。这就是您创建具有多个实际运行 index.php 的 URL 的站点的方式。您可以重定向,以便地址栏中的 URL 具有您的姓名并在服务器上打开不同的名称。您还可以重定向到 download.php 并在您的内部命名文件,它是某种模式。 @stevin 如果您不想触发下载并更改名称,唯一的解决方案是使用htaccess 更改网址,您可以采用稍微不同的方式。 其实我想在下载时获取实际名称,而不是自动下载。 @stevin 下载时你想让 id 成为你的名字吗? @jubic 不是 id,我存储在 DB 中的实际名称。

以上是关于如何在新选项卡中打开时重命名保存在服务器上的pdf的主要内容,如果未能解决你的问题,请参考以下文章

链接在新选项卡中打开并关注上一个选项卡[重复]

AngularJS UI 路由器 - 在新的浏览器选项卡中使用数据打开状态

如何使用html在新选项卡中打开指向pdf文件的链接

C#:从 Web 服务返回的字节 [] 在新选项卡中显示 PDF

如何在javascript中捕获新标签事件中的打开链接?

在新选项卡中打开 PDF - Blazor