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 文字列を渡すことも可能ですか?.

私が感謝するかもしれないどんな助けでも。

-ロガナサン

4

3 に答える 3

2

カスタム ヘッダーを使用するということは、カスタム クライアントだけがそれを探すことを意味します。それが正しい選択かどうかはわかりませんが、カスタム ヘッダー標準ヘッダーの両方を使用することをお勧めしますContent-Disposition

この回答に基づいて、複数の戦略があります。

  • RFC 5987 エンコーディング
  • ダイレクト UTF-8 エンコーディング
  • IE (UTF-8、パーセント記号) エンコーディング

ユーザー エージェントをオンにして、HTTP 応答を作成できます。もう 1 つのオプションは、ダウンロード リンクに UTF-8 でエンコードされた URL を使用することです (そのため、ブラウザはパスの最後の部分、つまりファイル名を提示します)。

iOS アプリが失敗する理由を特定するのは困難です。これは、使用されている HTTP ライブラリと、ヘッダー内のバイトをデコードする方法に依存し、コードがなければ特定できないためです。

于 2013-03-26T13:02:01.750 に答える
0

Web ページで同様の問題が発生し、適切なエンコーディング宣言を HTTP ヘッダー フィールドの Content-Type に入れて解決しました。

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

多分あなたが同じことをしたら...

于 2013-03-26T12:50:32.800 に答える
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];
于 2013-04-04T09:21:31.793 に答える