场景:(在PHP中)我有一个表单提交,其中包含UTF-8编码的字符串($name)以支持国际字符.在提交表单(通过GET)后,我正在创建一个CSV下载文件.我希望文件的名称是字符串 + .csv ("$name.csv").对于西方字符集,我可以通过以下方式做到这一点:
header("Content-Disposition: attachment; filename=\"$name\"");
Run Code Online (Sandbox Code Playgroud)
但对于其他字符集,下载文件的名称是垃圾字母 + .csv(例如×œ×œ× ×›×•×ª×¨×ª.csv).我试图遵循RFC 2231做类似的事情:
header("Content-Disposition: attachment; filename*=UTF-8''$name");
Run Code Online (Sandbox Code Playgroud)
但我似乎有几个问题:
我需要$name编码以十六进制编码的八位字节的每个字符,如" This%20is%20%2A%2A%2Afun%2A%2A%2A".有没有人有正确的功能?我编写了以下代码,但我不认为这是正确的:
$fileName = encodeWordRfc2231($name) . ".csv";
header("Content-Disposition: attachment; filename*=UTF-8''$fileName");
function &encodeWordRfc2231($word) {
$binArray = unpack("C*", $word);
foreach ($binArray as $chr) {
$hex_ary[] = '%' . sprintf("%02X", base_convert($chr, 2, 16));
}
return implode('', $hex_ary);
}
Run Code Online (Sandbox Code Playgroud)有没有人有这方面的经验,可以让我走上正确的道路?
我需要从网址下载一个文件,其格式类似于http://server.com/settings/files/1我在网络浏览器中粘贴此网址时这可以确定要在这种情况下下载的文件的名称scheme_563.txt,我的问题是如何检索文件的名称(这显然是不包含在URL)使用WinInet函数下载?目前我使用的是HttpQueryInfo与像HTTP_QUERY_CONTENT_LOCATION,HTTP_QUERY_CONTENT_DESCRIPTION等,但没有运气的倍数值的功能.
我有一个MVC控制器方法定义如下:
public ActionResult GetPdf(string filename)
{
var pdfDownload = File("~/Content/GeneratedReports/report1.pdf", "application/pdf", Server.UrlEncode("report1.pdf"));
return pdfDownload;
}
Run Code Online (Sandbox Code Playgroud)
如果我将第一个参数更改为托管在单独的云服务器上的服务器的URL,那么我会收到错误:
'MY FILE PATH'不是有效的虚拟路径.
我只是希望我的客户能够下载文件.这似乎比它需要的复杂得多.
我有一个指向PDF的URL.我希望我的客户在不点击任何内容的情况下下载该pdf.(下载将在成功的服务响应后启动)
为什么这么难,我该如何解决?
我不在乎解决方案是JS还是MVC ....
我强迫下载到浏览器的文件头部中设置进行处理Content-disposition,以inline;
有没有这样设置标题的方法?当前,看起来浏览器会自动使用文件的URL填充它。
我正在尝试为我的用户生成并返回文件.某些文件名包含unicode字符:aäa.pdf.当尝试在IE 9中下载它们时,文件名被破坏,下载如下所示:

在Chrome中,它按预期工作.这是return语句:
return File(fileStream: stream,
contentType: System.Net.Mime.MediaTypeNames.Application.Octet,
fileDownloadName: myModel.Name + "." + pub.OutputFileType);
Run Code Online (Sandbox Code Playgroud)
我该如何解决IE 9的问题?
.net utf-8 filestreamresult internet-explorer-9 asp.net-mvc-3
我正在尝试使用请求库提交 POST 来上传文件。
\n\n这工作正常:
\n\ntheFile = { \'LUuploadFile\': ("linea.ipa", open(path_to_file, \'rb\'), \'application/octet-stream\') }\nrequest = requests.post(url, files=theFile)\nRun Code Online (Sandbox Code Playgroud)\n\n这会引发错误:
\n\ntheFile = { \'LUuploadFile\': ("li\xcc\x81nea.ipa", open(path_to_file, \'rb\'), \'application/octet-stream\') }\nrequest = requests.post(url, files=theFile)\nRun Code Online (Sandbox Code Playgroud)\n\n这个错误很奇怪:
\n\n( <class \'requests.exceptions.ConnectionError\'>,\n ConnectionError(MaxRetryError("HTTPSConnectionPool(host=\'fupload.apperian.com\', port=443): \n Max retries exceeded with url: /upload?transactionID=... \n (Caused by <class \'socket.error\'>: [Errno 32] Broken pipe)",),),\n <traceback object at 0x100a8e3f8>)\nRun Code Online (Sandbox Code Playgroud)\n\n它不是服务器,如果我使用它,它接受文件名curl:
curl --form "LUuploadFile=@li\xcc\x81nea.ipa" http://...\nRun Code Online (Sandbox Code Playgroud)\n 我使用以下代码和函数来强制下载文件,如果文件名不包含瑞典语字符,则效果很好\xc3\x85 \xc3\x84 \xc3\x96.
$file_id = $_GET[\'f\'];\n\n$sql = " SELECT * ".\n " FROM attachment ".\n " WHERE attachment_id = ".$file_id." ".\n\n $res = mysql_query($sql);\n $row = mysql_fetch_array($res);\n $filename = $row[\'filename\'];\n $USER_ID = $row[\'user_id\'];\n $Directory_id = $row[\'directory_id\'];\n $target_path = "upload/".$USER_ID."/".$Directory_id."/";\n\n\nfunction Download($path, $speed = null)\n{\n if (is_file($path) === true)\n {\n $file = @fopen($path, \'rb\');\n $speed = (isset($speed) === true) ? round($speed * 1024) : 524288;\n\n if (is_resource($file) === true)\n {\n set_time_limit(0);\n ignore_user_abort(false);\n\n while (ob_get_level() > 0)\n {\n ob_end_clean();\n }\n\n …Run Code Online (Sandbox Code Playgroud) 此处使用 Symfony 2.5,用户将 MS Office 文件上传到我们的应用程序中,并在以后根据需要下载。现在,当文件附件包含非 ASCII 字符(这很常见,因为我们来自捷克共和国),Symfony 会引发错误“文件名回退必须仅包含 ASCII 字符。”
我发现了很多关于这个问题的报告和讨论,例如
...但没有真正的解决方案。我知道在制作 Content-Disposition 标头时我可以将文件名转换为 ascci,但它会更改呈现给用户的文件名,这对用户来说并不好而且相当误导。有没有办法避免这种情况并能够提供以前的文件名?能够下载文件名中包含非 ASCII 字符的文件在互联网上很常见,那么为什么有这个限制呢?
按照此How to Encode the filename parameter of Content-Disposition header in HTTP? 我什至尝试使用 urlencode() 对文件名进行编码,但现在它说 % 不允许使用 char :-(
更新 1: 这是我正在使用的代码片段。我正在使用流式传输对浏览器的响应,并且我认为标头是手动定义的。
$response = new StreamedResponse();
$response->headers->set('Content-Type', $upload->getMimeType());
$contentDisposition = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $upload->getFilename());
$response->headers->set('Content-Disposition', $contentDisposition);
Run Code Online (Sandbox Code Playgroud) 在 javax.ws.rs.core.Response.ResponseBuilder 中,当我使用波兰语(德语、法语等)国家字符设置文件名时,它会在将响应发送到客户端之前更改文件名:
\n\nResponseBuilder response = Response.ok(file);\nresponse.header("Content-Disposition", "attachment; filename=\xc5\xbc\xc3\xb3\xc5\x82ty.txt");\nRun Code Online (Sandbox Code Playgroud)\n\n此后,文件将被下载为“-\xc3\xb3Bty.txt”。如何解决这个问题?
\n\n编辑:\n整个应用程序可以使用 UTF-8 正常工作(例如,json 内容包含波兰语字符)。只有 http headers 没有。
\n来自如何在 HTTP 中对 Content-Disposition 标头的文件名参数进行编码?我了解到 RFC 5987 中定义的编码用于对Content-disposition标头中的文件名进行编码。从/sf/answers/95315251/我了解到,至少自 2012 年 11 月以来,主要浏览器的支持都很好。这两个问题都相当老了,但我找不到根据python/tornado 中的这种编码。我有一个
self.set_header('Content-Disposition', 'attachment;filename="{}.{}"'.format(basename, format))
Run Code Online (Sandbox Code Playgroud)
在我的代码中,当basename包含 latin1 之外的字符时会失败,我正在寻找一种标准方法对其进行编码。