"名称为"web pdf更好的默认保存的文件中的杂技演员?
-
02-07-2019 - |
题
我程序生成的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)
要记住的要点:
- 从服务 返回正确数组大小的流
- 根据流长度从流中读取具有正确字节长度的字节文件。
- 设置正确的内容类型 醇>
以下是读取流的代码,并打开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”。
丹