我程序生成的Pdf文件,用户的消费。在"Content-Disposition"http头设置如前所 在这里,.这个是设定为"inline;filename=foo。pdf",这应该是足够的杂技演员给予"foo。pdf"作为文件保存时pdf。

然而,后点击了"拯救"按钮,在浏览器的嵌入式Acrobat、默认的名称的保存不是文件,而是将网址与斜线更改以下划线。巨大的,丑陋的。有没有办法影响这个默认的文件在Adobe?

有一串查询的网址,这是不可谈判的。这可能是重要的,但加入一个"&foo=/标题。pdf"到底该网址不影响默认文件。

更新2:我都试过

content-disposition  inline; filename=foo.pdf
Content-Type         application/pdf; filename=foo.pdf

content-disposition  inline; filename=foo.pdf
Content-Type         application/pdf; name=foo.pdf

(作为验证通过萤火虫)可悲的是,既没有工作。

一样的url

/bar/sessions/958d8a22-0/views/1493881172/export?format=application/pdf&no-attachment=true

这意味着默认Acrobat保存的文件名

http___localhost_bar_sessions_958d8a22-0_views_1493881172_export_format=application_pdf&no-attachment=true.pdf

更新3:朱利安Reschke带来实际的洞察力和严谨性,这种情况。请投票他的回答。这似乎是打破在FF(https://bugzilla.mozilla.org/show_bug.cgi?id=433613)和即但工作在歌剧院、野生动物园,和铬。 http://greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf

有帮助吗?

解决方案

部分问题是相关的 RFC 2183 并未真正说明处理类型为“内联”的处理方式和文件名。

另外,据我所知,唯一实际使用type = inline文件名的UA是Firefox(参见测试用例)。

最后,插件API实际上可以提供这些信息并不明显(也许熟悉API的人可以详细说明)。

话虽这么说,我已经向Adobe人发送了一个指向这个问题的指针;也许合适的人会看看。

相关:请参阅 draft-reschke-rfc2183-in-http - 这是早期的工作进展,反馈意见赞赏。

更新:我添加了测试用例,这似乎表明Acrobat阅读器插件不使用响应头(在Firefox中),尽管插件API提供了对它们的访问。

其他提示

同样在 ContentType 中设置文件名。这应该可以解决问题。

context.Response.ContentType = "application/pdf; name=" + fileName;
// the usual stuff
context.Response.AddHeader("content-disposition", "inline; filename=" + fileName);

设置content-disposition标头后,还要添加content-length标头,然后使用binarywrite来传输PDF。

context.Response.AddHeader("Content-Length", fileBytes.Length.ToString());
context.Response.BinaryWrite(fileBytes);

和你一样,我试过让它发挥作用。最后我放弃了这个想法,只是选择了解决方法。

我正在使用ASP.NET MVC Framework,因此我修改了该控制器/操作的路由,以确保提供的PDF文件是URI的位置部分的最后一部分(在查询字符串之前),并传递查询字符串中的所有其他内容。

例如:

旧URI:

http:// server / app / report / showpdf?param1 = FOO&安培; param2的=栏&安培;文件名= myreport.pdf

新URI:

http:// server / app / report / showpdf / myreport。 PDF参数1 = FOO&安培; param2的=栏

结果标题看起来与您所描述的完全一样(内容类型是application / pdf,处理是内联的,文件名是标题的无用部分)。 Acrobat在浏览器窗口中显示它(不保存为对话框),如果用户单击Acrobat Save按钮,则自动填充的文件名是报告文件名。

一些注意事项:

为了使文件名看起来像样,它们不应该有任何转义字符(即没有空格等)......这有点限制。在这种情况下,我的文件名是自动生成的,之前有空格,在生成的保存对话框文件名中显示为'%20'。我只是用下划线替换了空格,结果很明显。

这不是最好的解决方案,但确实有效。这也意味着您必须拥有可用的文件名才能使其成为原始URI的一部分,这可能会破坏您的程序的工作流程。如果在生成PDF的服务器端调用期间当前正在从数据库生成或检索它,则可能需要将生成文件名的代码移动到javascript作为表单提交的一部分,或者如果它来自数据库,则将其设置为快速ajax调用以在构建导致内联PDF的URL时获取文件名。

如果您从表单上的用户输入中获取文件名,则应验证该文件名不包含转义字符,这会使用户烦恼。

希望有所帮助。

尝试在任何其他参数之前将文件名放在URL的末尾。这对我有用。 http://www.setasign.de/support/提示和 - 技巧/文件名功能于浏览器的插件/

在ASP.NET 2.0改变URL

http://www. server.com/DocServe.aspx?DocId=XXXXXXX

http://www. server.com/DocServe.aspx/MySaveAsFileName?DocId=XXXXXXX

这适用于Acrobat8和默认SaveAs文件名是现在 MySaveAsFileName.pdf.

但是,你必须限制允许使用的字符 MySaveAsFileName (没有时间,等等)。

Apache的 mod_rewrite 可以解决这个问题。

我有一个带有端点的Web服务,位于 /foo/getDoc.service 。当然,Acrobat会将文件保存为 getDoc.pdf 。我在 apache.conf

中添加了以下行
LoadModule     RewriteModule         modules/mod_rewrite.so
RewriteEngine  on
RewriteRule    ^/foo/getDoc/(.*)$    /foo/getDoc.service     [P,NE]

现在,当我请求 /foo/getDoc/filename.pdf?bar&qux 时,它会被内部重写为 /foo/getDoc.service?bar&qux ,所以我正在访问Web服务的正确端点,但Acrobat认为它会将我的文件保存为 filename.pdf

如果你使用asp.net你可以控制pdf文件,通过网页(网址)的文件名称。作为其他用户写的杂技演员是一位s...当它选择的pdf文件的名称时,按下"保存"按钮:它需要的网页名称、删除的扩展,添加"。pdf"。因此/foo/bar/GetMyPdf.aspx给GetMyPdf.pdf。

唯一的解决办法,我发现是管理"动态"的网页通过一个名字asp.net 处理程序:

  • 创建一个类实现该
  • 图一处理程序,在网上。config界的类

Mapping1:所有网页有一个共同的基数(MyDocument_):

<httpHandlers>  
<add verb="*" path="MyDocument_*.ashx" type="ITextMiscWeb.MyDocumentHandler"/>

Mapping2:完全免费的文件名称(需要一个文件夹在路径):

<add verb="*" path="/CustomName/*.ashx" type="ITextMiscWeb.MyDocumentHandler"/>

一些技巧在这里(pdf是动态的创建使用iTextSharp):
http://fhtino.blogspot.com/2006/11/how-to-show-or-download-pdf-file-from.html

您可以尝试内联而不是附件:

Response.AddHeader("content-disposition", "inline;filename=MyFile.pdf");

我在之前的Web应用程序中使用了内联,该应用程序将Crystal Reports输出生成为PDF并将其在浏览器中发送给用户。

带保存和打开选项的文件下载对话框(PDF)

要记住的要点:

  1. 从服务
  2. 返回正确数组大小的流
  3. 根据流长度从流中读取具有正确字节长度的字节文件。
  4. 设置正确的内容类型
  5. 以下是读取流的代码,并打开PDF文件的“文件下载”对话框

    private void DownloadSharePointDocument()
    {
        Uri uriAddress = new Uri("http://hyddlf5187:900/SharePointDownloadService/FulfillmentDownload.svc/GetDocumentByID/1/drmfree/");
        HttpWebRequest req = WebRequest.Create(uriAddress) as HttpWebRequest;
        // Get response   
        using (HttpWebResponse httpWebResponse = req.GetResponse() as HttpWebResponse)
        {
            Stream stream = httpWebResponse.GetResponseStream();
            int byteCount = Convert.ToInt32(httpWebResponse.ContentLength);
            byte[] Buffer1 = new byte[byteCount];
            using (BinaryReader reader = new BinaryReader(stream))
            {
                Buffer1 = reader.ReadBytes(byteCount);
            }
            Response.Clear();
            Response.ClearHeaders();
            // set the content type to PDF 
            Response.ContentType = "application/pdf";
            Response.AddHeader("Content-Disposition", "attachment;filename=Filename.pdf");
            Response.Buffer = true;
            Response.BinaryWrite(Buffer1);
            Response.Flush();
           // Response.End();
        }
    }
    

我相信这已经在一种或另一种味道中提到过,但我会试着用我自己的话说出来。

而不是:

/bar/sessions/958d8a22-0/views/1493881172/export?format=application/pdf&no-attachment=true

我用这个:

/bar/sessions/958d8a22-0/views/1493881172/NameThatIWantPDFToBe.pdf?GeneratePDF=1

而不是“导出”而不是处理请求,当请求进来时,我查看GeneratePDF = 1的URL。如果找到,我运行在“export”中运行的任何代码。而不是允许我的系统尝试在 /bar/sessions/958d8a22-0/views/1493881172/NameThatIWantPDFToBe.pdf 位置搜索和提供PDF。如果在URL中找不到GeneratePDF,我只是传输请求的文件。 (请注意,我不能简单地重定向到所请求的文件 - 否则我最终会无限循环)

您可以随时拥有两个链接。一个在浏览器中打开文档,另一个下载它(使用不正确的内容类型)。这就是Gmail的功能。

对于仍然关注此问题的人,我使用此处找到的解决方案工作得非常好。谢谢Fabrizio!

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

function MakeFriendlyURI($URI, $ScriptName) {

/* Need to remove everything up to the script name */
$MyName = '/^.*'.preg_quote(basename($ScriptName)."/", '/').'/';
$Str = preg_replace($MyName,'',$URI);
$RequestArray = array();

/* Breaks down like this
      0      1     2     3     4     5
    PARAM1/VAL1/PARAM2/VAL2/PARAM3/VAL3
*/

$tmp = explode('/',$Str);   
/* Ok so build an associative array with Key->value
   This way it can be returned back to 

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

<*>

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

REQUEST = MakeFriendlyURI(

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

<*>

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

SERVER['PHP\_SELF'],

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

<*>

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

SERVER['SCRIPT_FILENAME']);

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

REQUEST or

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

<*>

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

REQUEST = MakeFriendlyURI(

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

<*>

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

SERVER['PHP\_SELF'],

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

<*>

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

SERVER['SCRIPT_FILENAME']);

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

GET */ for ($i=0;$i < count($tmp); $i = $i+2){ $RequestArray[$tmp[$i]] = $tmp[$i+1]; } return $RequestArray; }//EO MakeFriendlyURI

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

REQUEST = MakeFriendlyURI(

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

<*>

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

SERVER['PHP\_SELF'],

我解决这个问题的方法(使用PHP)如下:

假设您的网址是 SomeScript.php?id = ID&amp; data = DATA ,您要使用的文件是 TEST.pdf

将网址更改为 SomeScript.php / id / ID / data / DATA / EXT / TEST.pdf

最后一个参数是您希望Adobe使用的文件名(“EXT”可以是任何内容),这一点很重要。确保上面的字符串中没有特殊的字符,BTW。

现在,在 SomeScript.php 的顶部,添加:

<*>

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

SERVER['SCRIPT_FILENAME']);

然后将此函数添加到 SomeScript.php (或您的函数库):

<*>

现在 $ _ REQUEST (或 $ _ GET ,如果您愿意)可以像普通的 $ _ REQUEST ['id'] 一样进行访问$ _REQUEST ['data'] 等。

当您以内联方式发送内容时,Adobe将使用您想要的文件名作为默认保存或电子邮件信息。

我被重定向到这里因为我有同样的问题。我也尝试了特洛伊霍华德的解决方法,但似乎没有用。

我在这个方法上做的方法是不再使用响应对象来动态写入文件。由于PDF已存在于服务器上,我所做的是重定向指向该PDF文件的页面。效果很好。

http://forums.asp.net/t/143631.aspx

我希望我的模糊解释能给你一个想法。

Vivek 的致谢。


的Nginx

location /file.pdf
{
    # more_set_headers "Content-Type: application/pdf; name=save_as_file.pdf";
    add_header Content-Disposition "inline; filename=save_as_file.pdf";
    alias /var/www/file.pdf;
}

检查

curl -I https://example.com/file.pdf

Firefox 62.0b5(64位):好的。

Chrome 67.0.3396.99(64位):好的。

IE 11:没有评论。

如果您的可执行文件是“get.cgi”

,请尝试此操作

http://server,org/get.cgi/filename pdf格式?FILE = filename.pdf

是的,这完全是疯了。没有名为“filename.pdf”的文件。在服务器上,可执行文件get.cgi下有目录。

但似乎有效。服务器忽略filename.pdf,pdf阅读器忽略“get.cgi”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top