2009-03-30 10 views
1

PHPでイメージをアップロードおよびサイズ変更するファイル(イメージ)アップロードスクリプトがあります...単純なMIMEタイプとサイズの検証を使用しているため、最大ファイルサイズは1MBです。PHPで許可されたMIMEファイルタイプの問題が発生しました

私は最近問題を発見しました。スクリプトを使用して.aviファイルをアップロードしようとすると、スクリプトは正しいMIMEタイプとサイズのようなファイルを処理し、何もしないだけでエラーメッセージなしでアップロードフォームに戻ります。 ( "ファイルが大きすぎる"というメッセージを表示する代わりに)。

つまり、.gifや.txtなどをアップロードしようとすると、予想どおりエラーが発生します。 1MBを超えるファイルをアップロードしようとすると、予想どおりエラーが発生します。私は変更してい

// define a constant for the maximum upload size 
define ('MAX_FILE_SIZE', 1024000); 

if (array_key_exists('upload', $_POST)) { 
// define constant for upload folder 
define('UPLOAD_DIR', 'C:/Wamp/www/Version-1.4/posters_uploaded/'); 

// replace any spaces in original filename with underscores. At the same time, assign to a simpler variable 
$file = str_replace(' ', '_', $_FILES['image']['name']); 

// convert the maximum size to KB 
$max = number_format(MAX_FILE_SIZE/1024, 1).'kb'; 
// create an array of permitted MIME types 
$permitted = array('image/jpeg','image/pjpeg'); 
// begin by assuming the file is unacceptable 
$sizeOK = false; 
$typeOK = false; 

// check that file is within the permitted size 
if ($_FILES['image']['size'] > 0 && $_FILES['image']['size'] <= MAX_FILE_SIZE) { 
    $sizeOK = true; 
} 
// check that file is of a permitted MIME type 
foreach ($permitted as $type) { 
    if ($type == $_FILES['image']['type']) { 
     $typeOK = true; 
    break; 
    } 
} 

if ($sizeOK && $typeOK) { 
    switch($_FILES['image']['error']) { 
     case 0: // ................... 

:私は1メガバイトを超えると.AVIファイルをアップロードしようとすると、 のみ私はここでエラーのいずれかの種類..... まあ、コードの最初のパーを得るいけませんビルドPHPコードので、私は専門家... 任意の提案??おかげさまで

+0

あなたの場合投稿されたファイルのサイズは、aviの –

+0

関連していません。私は別のファイルとのtryied .. 400MBと800MBの間のサイズ。 – Jonathan

答えて

0

上記のjohn Raschのように、php.ini max_upload_filesizeを超えるファイルはまったく処理されません。エラーをテストする機会はありません。それがアップロードされていなかったと仮定して、それが正当化されていればそれを検証しなければなりません。


今私はもっと自分のシナリオを理解していることを私は、これはあなたが何ができるかだと思う:

// at the top of your script 
$upload_success = FALSE; 


// when successfully detected upload 
$upload_success = TRUE; 



// if successful upload code is never run 
$display_error = "File not uploaded, may be too large a file, " 
. "please upload less than 1MB" 
; 
print $display_error; 

メインポイントビーイング:

あなたは常にそのアップロードファイルを検出できませんスクリプトが実行される場所よりも深いレベルで切断されるため、大きすぎます。

+0

php.iniをチェックしました... 2MBの制限があります... ;アップロードされたファイルの最大許容サイズ。 upload_max_filesize = 2M だから、それは問題ではありません.... – Jonathan

+0

?私はあなたがそれが問題だと実証したと思います。あなたのaviが1〜2MBの間でなければ、ほとんどのaviファイルは2MBをかなり上回っています。私たちはフラッシュビデオアップローダーを持っており、最大で18を設定しています。 –

+0

はい、私のaviファイルは600MBです。 ..私は1MBの制限が欲しい。なぜ私はちょうど1 MBの制限がほしいとすればより大きな最大を設定する必要があるのですか? – Jonathan

2

http://us3.php.net/manual/en/features.file-upload.common-pitfalls.php

あなたupload_max_filesizeのini設定が低すぎるように見えます。これにより、AVIビデオなどの非常に大きなファイルをアップロードするときにエラーが表示されることはありません。

それらのファイルのサイズが1 MBを超えるが、php.iniのでのごupload_max_filesize設定値以下であるため、あなたはテキストファイルと.JPGイメージでエラーを見ている理由がありそうです。

ini_get("max_upload_filesize")の値をINGのecho試してみて、あなたが直接のphp.iniファイルへのアクセス権を持っていない場合は、値が何であるかを参照してください。この線の上

+0

php.iniをチェックしました... 2MBの制限があります... ;アップロードされたファイルの最大許容サイズ。 upload_max_filesize = 2M これは問題ではありません.... – Jonathan

+0

最大サイズは2 GBです。 –

+0

私は1 MB以上のファイルを許可したくありません。なぜ2 MBの制限を変更する必要があるのですか? – Jonathan

0

if ($_FILES['image']['size'] > 0 && $_FILES['image']['size'] <= MAX_FILE_SIZE) { 
     $sizeOK = true; 
} 

入れ、この:FILES配列の内側にあるものを紹介します、そしてデバッグにこれはかなり簡単にする必要があります

echo '<pre>' . printr($_FILES) . </pre>; 

。スクリプトに上記の行を追加してAVIをアップロードしてみてください。

+0

printr($ FILES)ではなく、print_r($ _ FILES)でなければなりません。 – Peter

+0

私の悪い、今すぐ修正します – karim79

0

また、私はあなたがMIMEタイプを信じていないことを示唆したいと思います。場合によっては.jpgに名前が変更された.pngまたは.gifファイルがあるか、意図的に不正なファイルをアップロードすることがあります。これらが有効なjpeg画像であるかどうかを確認するには、getimagesizeを使用してください。

+0

MIMEはファイル拡張子だけをチェックしています...私は思う... – Jonathan

+0

私がテストしたブラウザはMIMEタイプを設定しているようですが、ファイル拡張子に基づいています。彼らはイメージフォーマットに関して本当のテストをしません。それはあまりにも精巧です。私を信頼して、私はPHPの画像をアップロードするシステムを一から作りました。 – JAL

0

ファイルをアップロードするときに、実際にはphp.iniに注意する必要のあるディレクティブが2つあることを忘れないでください。 1つはupload_max_filesizeですが、もう1つはpost_max_sizeです。一般的に、post_max_sizeは、少なくともupload_max_filesizeと等しいか、それ以上である必要があります。 upload_max_filesizeの設定に関係なく、post_max_size以上のファイルはアップロードできません。

AVIファイルは、許可された配列にリストされているMIMEタイプと一致しません。 $ sizeOKと$ typeOKのチェックをした後、それらの値が保持する値とスクリプトがそれらの値をどのように扱うかを確認します。それはあなたのスクリプトの振る舞いの鍵を握っているかもしれません。

0

MIMEをチェックするために$ _FILES ['image'] ['type']を使用することは信頼できません。これはクライアントのヘッダーに基づいており、なりすますことができます。実際の内容をMIMEベースで確認するには、fileinfo拡張子を見てください。

0

8年後、誰のための短い答え、私のように、PHPで画像のMIMEタイプをチェックする答えを周りつまずくアップロードする前に:

if (exif_imagetype($file['tmp_name']) != IMAGETYPE_JPEG) { 
    $file['error'] = 'Your picture must be jpg.'; 
} 

をマニュアルから:http://php.net/manual/en/function.exif-imagetype.php

関連する問題