PHP:通过PHP文件传递国际文件名称下载对IOS客户端的响应

时间:2013-03-26 12:21:31

标签: php iphone ios

实际上我正在使用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

3 个答案:

答案 0 :(得分:2)

使用自定义标头意味着只有自定义客户端才会查找它。我不确定它是否是正确的选择,但更好的选择是使用自定义标题标准标题Content-Disposition

基于this answer,有多种策略:

  • RFC 5987编码
  • 直接UTF-8编码
  • IE(UTF-8,百分号)编码

您可以打开用户代理来构建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];