我的应用程序生成用户的消费PDF文件。 在“内容处置” HTTP标头设置为提到这里 。 这是设置为“内联;文件名= foo.pdf”,这应该是足够的Acrobat来保存PDF时,给“foo.pdf”作为文件名。
然而,在点击浏览器中嵌入Acrobat中的“保存”按钮,默认名称保存不是文件名,而是用斜线网址更改为下划线。 巨大而丑陋。 有没有办法影响到在Adobe这个默认的文件名?
有一个在URL的查询字符串,这是不可转让的。 这可能是显著,但增加了“&富= / title.pdf”到URL的结束并不影响默认的文件名。
更新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
(如通过Firebug的验证)可悲的是,既不工作。
样本网址是
/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:朱利安雷什克带来实际的洞察力和严谨的这种情况。 请给予好评他的回答。 这似乎在FF(被打破https://bugzilla.mozilla.org/show_bug.cgi?id=433613 )和IE,但工作在Opera,Safari和Chrome浏览。 http://greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf
Answer 1:
问题的部分原因是相关的RFC 2183并没有真正说明如何处理处置类型为“内联”和文件名的事。
此外,据我所知道的,唯一的UA实际使用的类型文件名=联是Firefox的(见测试案例 )。
最后,这不是明显的插件API实际上使该资料(也许someboy熟悉API能否详细说明)。
话虽这么说,我已经发出了指针,这个问题到Adobe的人; 也许合适的人会去看看。
相关新闻:看到试图澄清内容配置在HTTP的草稿雷什克-rfc2183功能于HTTP -这是正在进行前期工作,反馈赞赏。
更新:我添加了一个测试案例 ,这似乎表明,Acrobat Reader的插件不使用响应头(在Firefox),虽然插件API提供对它们的访问。
Answer 2:
设置contentType中的文件名也。 这应该解决的问题。
context.Response.ContentType = "application/pdf; name=" + fileName;
// the usual stuff
context.Response.AddHeader("content-disposition", "inline; filename=" + fileName);
在设置内容处置头,还添加内容长度的头,然后使用的BinaryWrite流式传输的PDF。
context.Response.AddHeader("Content-Length", fileBytes.Length.ToString());
context.Response.BinaryWrite(fileBytes);
Answer 3:
和你一样,我尝试并试图得到这个工作。 最后,我放弃了这个想法,只是选择了一种解决方法。
我使用ASP.NET MVC框架,所以我修改了我的路线是控制器/行动,以确保在担任了PDF文件的URI的位置部分的最后一部分(查询字符串之前),并通过一切否则在查询字符串。
例如:
老URI:
HTTP://服务器/应用程序/报告/ showpdf参数1 =富&参数2 =酒吧和文件名= myreport.pdf
新有:
HTTP://server/app/report/showpdf/myreport.pdf参数1 =富&参数2 =酒吧
得到的头看起来就像你所描述的内容(内容类型是application / PDF,性格内联,文件名是无用的报头的一部分)。 Acrobat中显示它在浏览器窗口(没有另存为对话框),这是自动填充,如果用户点击的Acrobat保存按钮是报告文件名的文件名。
有几个方面的考虑:
为了使文件名看起来体面,他们不应该有任何转义字符(例如,没有空格等)......这是一个有点限制。 在这种情况下,我的文件名自动生成的,并曾在他们的空间,这被显示为“%20的在保存对话框的文件名之前。 我刚刚替换为下划线的空间,并制定出。
这是没有名字的最佳解决方案,但它确实工作。 这也意味着,你必须有可用的文件名,使其成为原始的URI,这可能会惹你的程序的工作流程的一部分。 如果它当前正在生成或从服务器端调用生成的PDF中数据库检索,您可能需要移动生成的文件名JavaScript作为表单提交的一部分,或者如果它来自一个数据库,使之成为代码快速调用Ajax构建导致内联PDF中的URL时,你得到的文件名。
如果您在表格上采取的文件名从用户输入,那么就应该进行验证不包含转义字符,这会惹恼用户。
希望帮助。
Answer 4:
试着将文件名在网址的结尾,在任何其他参数。 这为我工作。 http://www.setasign.de/support/tips-and-tricks/filename-in-browser-plugin/
Answer 5:
在ASP.NET 2.0中更改从URL
http://www. server.com/DocServe.aspx?DocId=XXXXXXX
至
http://www. server.com/DocServe.aspx/MySaveAsFileName?DocId=XXXXXXX
这适用于的Acrobat 8,现在默认另存为文件名是MySaveAsFileName.pdf
。
但是,你必须限制在允许的字符MySaveAsFileName
(无段等)。
Answer 6:
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
。
Answer 7:
如果你使用asp.net,你可以控制通过网页(URL)的文件名PDF文件名。 至于其他用户写道,Acrobat中是位S ...当它选择PDF文件名,当你按下“保存”按钮:它需要的页面名称,删除扩展,并添加“.PDF”。 所以/foo/bar/GetMyPdf.aspx给GetMyPdf.pdf。
我发现的唯一的解决方案是通过一个asp.net处理程序管理“动态”页面名称:
- 创建一个实现IHttpHandler的类
- 在web.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
Answer 8:
相反,附件的你可以尝试在线:
Response.AddHeader("content-disposition", "inline;filename=MyFile.pdf");
我在生成的水晶报表输出为PDF和发送在浏览器的用户以前的web应用所使用的内联。
Answer 9:
文件下载对话框(PDF)与保存和打开选项
要记住的要点:
- 返回物流与服务正确的数组大小
- 阅读包含流长度的基础上,正确的字节长度流字节arrary。
- 设置正确的contentType
下面是读取数据流的代码,并打开文件下载对话框中的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();
}
}
Answer 10:
我相信这已经在一个味或其他被提及,但我会尽力,并说明它在我自己的话。
而不是这样的:
/bar/sessions/958d8a22-0/views/1493881172/export?format=application/pdf&no-attachment=true
我用这个:
/bar/sessions/958d8a22-0/views/1493881172/NameThatIWantPDFToBe.pdf?GeneratePDF=1
而不是“出口”处理请求,当请求到来时,我在看的URL GeneratePDF = 1。 如果找到,我运行任何代码是在“出口”上运行,而不是让我的系统尝试搜索和服务于该位置的PDF /bar/sessions/958d8a22-0/views/1493881172/NameThatIWantPDFToBe.pdf
。 如果URL中没有找到GeneratePDF,我简单地传输所要求的文件。 (请注意,我不能简单地重定向到请求的文件 - 否则我就死循环结束)
Answer 11:
你总是可以有两个环节。 一个打开的文档在浏览器中,另一个下载(使用不正确的内容类型)。 这是Gmail中做什么。
Answer 12:
对于任何人还在找这个,我以前找到解决方案在这里 ,它表现的很出色。 法布里奇奥谢谢!
Answer 13:
我解决了这个(与PHP)的方法如下:
假设您的网址是SomeScript.php?id=ID&data=DATA
和您要使用的文件是TEST.pdf
。
更改URL以SomeScript.php/id/ID/data/DATA/EXT/TEST.pdf
。
重要的是,最后一个参数是你希望Adobe使用(以下简称“EXT”可以是任何东西)的文件名。 确保有在上面的字符串没有特殊字符,BTW。
现在,在顶部SomeScript.php
,添加:
$_REQUEST = MakeFriendlyURI( $_SERVER['PHP\_SELF'], $_SERVER['SCRIPT_FILENAME']);
那么这个功能添加到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 $_REQUEST or $_GET
*/
for ($i=0;$i < count($tmp); $i = $i+2){
$RequestArray[$tmp[$i]] = $tmp[$i+1];
}
return $RequestArray;
}//EO MakeFriendlyURI
现在, $_REQUEST
(或$_GET
,如果你喜欢)是像正常访问$_REQUEST['id']
$_REQUEST['data']
等等。
和Adobe将使用您所需的文件名作为默认保存为或当您在线发送的电子邮件信息。
Answer 14:
我被重定向到这里,因为我有同样的问题。 我也试着特洛伊霍华德的解决方法,但它似乎并没有工作。
我就这一个做的方法是不再使用响应对象写在飞行文件。 由于PDF已经在服务器上现有的,我所做的就是我的页面指向重定向到PDF文件。 伟大的作品。
http://forums.asp.net/t/143631.aspx
我希望我的解释含糊不清给你的想法。
Answer 15:
学分维韦克 。
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
火狐62.0b5(64位):OK。
铬67.0.3396.99(64位):OK。
IE 11:暂无评论。
Answer 16:
试试这个,如果你的可执行文件是“get.cgi”
HTTP://server,org/get.cgi/filename.pdf文件= filename.pdf
是的,这是完全疯了。 不存在所谓的服务器上“filename.pdf”文件中,有在目录下的所有可执行文件get.cgi。
但它似乎工作。 服务器忽略filename.pdf和PDF阅读器忽略“get.cgi”
和
文章来源: “name” web pdf for better default save filename in Acrobat?