1

アップロードしたファイルをhttps経由でダウンロードしようとしていますが、ファイル自体はダウンロードされますが、表示できません。

JPG、DOC、XLSファイルを試しましたが、すべて同じ問題が発生します。すべての場合、FTP経由でダウンロードすると、完全に開き、スクリプトを使用して事前ダウンロードしたブラウザーで正常に開きます。

これが私が使おうとしているコードを示すスクリプトのサブセットですか?なぜゴミをダウンロードするのか分かりますか?

$_file = sanitiseData($_GET['doc']);
$filename = '/doc_uploads/'.$_file; 
if (file_exists($filename)) { 
header('Content-type:image/jpg');
header('Content-Disposition: attachment; filename="'.$_file.'"');
echo file_get_contents($filename);
} else { 
echo "The file $_file does not exist"; 
} 

ダウンロードしたJPGをブラウザで表示しようとしたときのゴミのサンプルを次に示します。

����JFIF��;CREATOR:gd-jpeg v1.0(IJG JPEG v62を使用)、品質=90��C��C��R� "������}!1AQa"q2��� #B��R��$3br�%&'()* 456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������������������������������� ������������������������������������������������w!1AQaq "2�B����#3R�br�$4�%�&'()* 56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������ �������������������������������������������������� ?�P��q\�O�^�-�C�z�z����o�N��P;��.i�〜k+Ƕ���|�7`�'e� ���G�>+���_�6�%�Ž��Y�w���P�〜.�����2E����"��ڗȌ��ms���� [���?��%| "�R5�s�c������=?V��>���IG�=?V��>���I_Q@w����o ���������o����������=?V��>���IG�=?V��>����I_Q@w����o�� �������o����������=?V��>���IG�=?V��>����I_Q@w����o���� �����o����������=?V��>���IG�=?V��>���I_Q@w����o������ ���o����������=?V��>���IG�=?V��>���I_Q@w����o����������o����������=?V��>����IG�=?V��>�� �I_Q@w����o����������o����������=?V��>����IG�=?V��>���I_Q @w����o���������o����������=?V��>���IG�=?V��>���I_Q@ w ����o���������o����������=?V��>���IG�=?V��>���I_Q@w�� ��o���������o����������=?V��>���IG�=?V��>���I_Q@w���� o���������o����������=GU��>�����N�v������%|!E〜�xO��ỹx_P ����j(�z����_

4

2 に答える 2

3

あなたの最善の策は、readfile(...)を使用することです。PHP の Web サイトには、役立つ良い例があります。私は自分のウェブサイトでそれを使用していますが、それは魅力のように機能します:

if (file_exists($file)) {
    // Inform browser that this is a force-download
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    // Inform browser that data can be binary in addition to text
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    // Inform browser that this page expires immediately so that an update to the file will still work.
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    // Push actual file.
    ob_clean();
    flush();
    readfile($file);
    exit();
}
于 2012-06-09T17:30:01.060 に答える
0

"$filename"一重引用符により、変数値ではなく文字列が出力されます$filename

echo file_get_contents($filename);

関数 は表示されませんが、 のsanitiseData()ようなパス インジェクションに使用できる文字列を適切に除外していると想定しています../

補遺:

jpeg の正しい MIME タイプはimage/jpegではなく であることに注意してくださいimage/jpg。それはあなたにも問題を引き起こす可能性があります。

于 2012-06-09T15:46:46.440 に答える