web-dev-qa-db-ja.com

CodeIgniter:「アップロードしようとしているファイルタイプは許可されていません。」

非常に奇妙なアップロードの問題が発生しています。関連するビューファイルは次のとおりです。

_<form action="http://localhost/index.php/temp/upload/" method="post" enctype="multipart/form-data">
    <fieldset>
        <input type="file" name="userfile"/>
        <input type="submit" value="Upload"/>
    </fieldset>
</form>
_

そして、これは私のtempコントローラーのupload()メソッドです:

_public function upload()
{
    $config['upload_path']   = FCPATH . 'uploads' . DIRECTORY_SEPARATOR;
    assert(file_exists($config['upload_path']) === TRUE);
    $config['allowed_types'] = 'avi|mpg|mpeg|wmv|jpg';
    $config['max_size']      = '0';

    $this->load->library('upload', $config);
    if ($this->upload->do_upload('userfile') === FALSE)
    {
        // Some error occured
        var_dump($this->upload->display_errors('', ''));
        var_dump($_FILES);
    }
    else
    {
        // Upload successful
        var_dump($this->upload->data());
    }
}
_

AVIビデオをアップロードすると、すべて正常に動作します。たとえば、WMVビデオをアップロードすると、次のvarダンプが取得されます。

_string 'The filetype you are attempting to upload is not allowed.' (length=57)

array
  'userfile' => 
    array
      'name' => string 'wmv.wmv' (length=7)
      'type' => string 'video/x-ms-wmv' (length=14)
      'tmp_name' => string 'C:\wamp\tmp\php2333.tmp' (length=23)
      'error' => int 0
      'size' => int 83914
_

「wmv」拡張子は、MIMEタイプ_video/x-ms-wmv_として解釈されています。私のconfig/mimes.phpには次のものがあるので、これは問題ないはずです。

_'wmv' =>  array('video/x-ms-wmv', 'audio/x-ms-wmv')
_

他のファイルをアップロードしようとしたときも同様の状況です。これまでのところ、動作するように見える唯一のものは私のテストAVIビデオです。

何が間違っているのでしょうか?

更新1:

マイマシン、AVIのみアップロード。別の開発者のマシンでは、ファイルはアップロードされません。さらに別の開発者のマシンでは、サポートされているすべてのファイルがアップロードされます。これらのブラウザーまたはサーバーの問題ですか?

25

あなたはFirefoxを使用していますよね?

system/libraries/Upload.php行199を見てみてください:

$this->_file_mime_type($_FILES[$field]);

その行を次のように変更します。

$this->_file_mime_type($_FILES[$field]); var_dump($this->file_type); die();

次に、.wmvファイルをアップロードします。 application/octet-streamなどのようなものが表示されます。それをmimes.phpに追加します。このヘルプを願っています=)

同様の答え ここ

いくつかのリンク:

50
Rocco

$ config ["allowed_types"] = "*";

5
Kanchi
  1. CodeIgniterアプリケーションを実行するFTP/SFTP/scp/etcを使用して、サーバーに.wmvファイルをアップロードします
  2. .wmvファイルをアップロードしたサーバーで、次のPHPコードを実行します

    <?php
    $file_path = 'CHANGE_THIS_TO_ABSOLUTE_FILE_PATH_THAT_YOU_HAVE_UPLOADED.wmv';
    $finfo = finfo_open(FILEINFO_MIME);
    $mime = finfo_file($finfo, $file_path);
    var_dump($mime);
    ?>
    
  3. コードをmime.phpとして保存します

  4. ターミナルで実行-$ php mime.php
  5. Wmvに既にあるもの以外の値をダンプする場合は、その値をwmv mimeタイプに追加します。

他の開発マシンのPHP_VERSIONも確認してください。 finfo_openは、PHP 5.3で導入されています。アップロードが機能している開発マシンには、古いバージョンのPHPがあるか、wmvに適切なMIMEタイプがあります。

4
P M

$ config ['allowed_types']で拡張子の代わりにMIMEタイプを使用しようとしましたか?

このように書く

$config["allowed_types"] = "video/x-msvideo|image/jpeg|video/mpeg|video/x-ms-wmv";
2
Taha Paksu

Application/configのmimes.phpファイルを確認します。 MIMEタイプの配列を返す必要があります(例:return $mimes;ファイルの最後またはreturn array(..... mimes配列の先頭。

1

私は最近、Codeigniterのアップロードクラスで非常によく似た問題を抱えています。

* allowed_types *は機能していないようです。たとえば、.PNG画像のアップロードを許可したかったのですが、フィルターを介してそれらを許可しませんでした。私はそれをさらに調査することになりました。すべてのファイルタイプを一時的にアップロードし、.PNGをアップロードしてから、アップロードデータをダンプしました($ this-> upload-> data());)。何らかの理由で、MIMEタイプはtext/plain!これは問題に関連している可能性があります。

これにはいくつかの解決策がありますが、クラスやコアを変更/拡張できるフォーラムを閲覧しましたが、うまくいきませんでした-申し訳ありません。これはCodeigniter Coreのバグだと思います(この問題はEllisLabsですでに解決されていると思います)。とにかくいまいましいことをハードコーディングすることになりました!さて、これがあなたの助けになることを願っています。

基本的な例/回避策、

//replace with your allowed MIME types
if ($_FILES['name_of_form_upload']['type'] != 'image/jpeg' && $_FILES['name_of_form_upload']['type'] != 'image/png' && $_FILES['name_of_form_upload']['type'] != 'image/gif') {
    $data['message'] = '<div class="message">That file type is not allowed!</div>';
    $this->load->view('home_view', $data);
} else {
    //run upload code
}

編集:フォーマット/文法

1
envysea

CodeIgniterで.docファイルをアップロードするための回答

これを変える

'doc'   =>  'application/msword',

行番号95(application/config/mimes.phpファイル)

'doc'   =>  array('application/vnd.ms-Word','application/msword'),
1
Anil

これを解決する簡単な方法が必要な場合は、簡単な解決策があります。 「system/libraries/Upload.php」ファイルを開きます

line no 465
you will see 
if ( ! $this->is_allowed_filetype())
        {
            $this->set_error('upload_invalid_filetype', 'debug');
            return FALSE;
        }


just make it true

    if ( ! $this->is_allowed_filetype())
            {
                $this->set_error('upload_invalid_filetype', 'debug');
                return TRUE;
            }

note : it will stop your all file type validation.
0
Abhishek

これは実際にはコアのバグです。CIの最新バージョンにアップグレードすると、バグが消えました。

0
thedjaney

IN application\config\Mimes.phpを変更します

0
Anand