PHP:通过PHP文件下载头响应传递国际文件名给IOS客户端


PHP: Passing International File Names Via PHP File Download Header Response To IOS Clients

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