0

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

客户端代码 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

4

3 回答 3

2

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

基于这个答案,有多种策略:

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

您可以打开用户代理来构建您的 HTTP 响应。另一种选择是使用 UTF-8 编码的 URL 作为下载链接(因此浏览器会建议路径的最后一部分,即文件名)。

很难说出您的 iOS 应用程序失败的原因,因为它取决于所使用的 HTTP 库以及您如何解码标头中的字节,没有代码就无法分辨。

于 2013-03-26T13:02:01.750 回答
0

我在网页中遇到了类似的问题,我将正确的编码声明放在 HTTP 标头字段 Content-Type 中解决了它。

Content-Type: text/html;charset=utf-8

也许如果你也这样做......

于 2013-03-26T12:50:32.800 回答
0

最后我想出了如何做到这一点。这是我的解决方案 1. 在 PHP 方面,我使用了 json 解码。由于我将文件名解码为 ascii 或非 ascii,然后我将其设置在 header.xml 中。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];
于 2013-04-04T09:21:31.793 回答