实际上我正在使用ASIHTTPRequest库从我的ios应用程序下载文件。我想通过php头响应,同时下载文件传递国际字符(这是一个文件名)。基本上我创建新的自定义头名为"filename-display",同时构建文件下载头响应。
这里是我的PHP代码:
<?php
$dir = 'c:'좋은 아침.pdf';
$filename_display = '좋은 아침.pdf';
if (file_exists($dir)) {
header("HTTP/1.1 200");
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($dir));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('filename-display:' . $filename_display);
header('Content-Length:' . filesize($dir));
ob_clean();
flush();
readfile($dir);
exit;
}
else {
header("HTTP/1.1 404 file not found");
echo 'file_not_exists';
exit(0);
}
?>
客户端代码ashttprequest库委托调用:
#pragma mark
#pragma ASIHTTPREQUEST delegate methods
-(void)requestStarted:(ASIHTTPRequest *)request{
NSLog(@"'n file download start");
}
-(void)updateUploadProgress:(ASIHTTPRequest*)request
{
[request updateUploadProgress];
}
- (void)requestFailed:(ASIHTTPRequest *)request {
//handle it
}
- (void)requestFinished:(ASIHTTPRequest *)request {
NSDictionary *responseHeaders = [request responseHeaders];
NSLog(@"'nresponse header dict = %@", responseHeaders);
NSLog(@"'nfile name: %@", [responseHeaders objectForKey:@"filename-display"]);
}
我的ios应用程序的输出:
文件名:?????????.pdf而不是显示在PHP头端配置的实际文件名。
让我知道我可以在php端使用什么编码?也可以通过报头响应传递xml字符串。
任何可能的帮助我都很感激。
-loganathan
使用自定义头意味着只有自定义客户端会查找它。我不确定这是否是正确的选择,但是一个更好的选择是使用您的自定义标题和标准的Content-Disposition
。
基于这个答案,有多种策略:
- RFC 5987编码
- 直接UTF-8编码
- IE (UTF-8,百分号)编码
您可以打开用户代理来构建HTTP响应。另一种选择是使用UTF-8编码的URL作为下载链接(因此浏览器将建议路径的最后一部分,即文件名)。
很难知道为什么你的iOS应用会失败,因为这取决于你使用的HTTP库和你如何解码头中的字节,如果没有代码,你就无法判断。
我在一个网页中遇到了类似的问题,我在HTTP报头字段Content-Type中放置了适当的编码声明。
Content-Type: text/html;charset=utf-8
我终于知道该怎么做了。这是我的解决方案1. 在PHP方面,我使用json解码。因为我解码了文件名ascii或非ascii,然后我在header中设置。2. 在iOS端,我使用以下代码将编码的json转换为nsstring。
NSString *f_Name = <your jason string>;
NSString *convertedString = [f_Name mutableCopy];
//convert json encoded string to nsstring
CFStringRef transform = CFSTR("Any-Hex/Java");
//CFStringTransform((__bridge CFMutableStringRef)convertedString, NULL, transform, YES);
CFStringTransform((CFMutableStringRef)convertedString, NULL, transform, YES);
f_Name = convertedString;
//remove the double quotes from first and last position
f_Name = [f_Name substringFromIndex:1];
f_Name = [f_Name substringToIndex:[f_Name length] - 1];