实际上我正在使用ASIHTTPRequest Library从我的ios应用程序下载文件。我想在下载文件时通过php header response传递国际字符(它是文件名)。基本上我正在构建文件下载头响应时创建名为“ 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);
}
?>
客户端代码ASIHTTPRequest库代表电话:
#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
答案 0 :(得分:2)
使用自定义标头意味着只有自定义客户端才会查找它。我不确定它是否是正确的选择,但更好的选择是使用自定义标题和标准标题Content-Disposition
。
基于this answer,有多种策略:
您可以打开用户代理来构建HTTP响应。另一种选择是使用UTF-8编码的URL作为下载链接(因此浏览器将建议路径的最后部分,即文件名)。
很难说出你的iOS应用程序失败的原因,因为它取决于所使用的HTTP库以及如何解码标题中的字节,并且没有代码无法分辨。
答案 1 :(得分:0)
我在网页上遇到了类似的问题,我解决了它在HTTP头字段Content-Type中放置正确的编码声明。
Content-Type: text/html;charset=utf-8
也许如果你这样做......
答案 2 :(得分:0)
最后我想出了如何做到这一点。我的解决方案 1.在PHP方面,我使用了json解码。因为我解码了文件名ascii或非ascii然后我在标头中设置。 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];