33

当我测试具有此扩展名.JPG 的图像文件时,我正在制作上传脚本,我不知道 jpg 或 jpeg 之间有什么区别,但似乎 $_FILES 无法识别此文件类型。

我已经阅读了几个线程,$_FILES 在 mime 类型方面并不那么可靠,所以我决定使用 php 的 mime 类型函数mime_content_type()php's getimagesize()pathinfo()虽然 pathinfo 返回文件名和类型,但我需要路径对于不存在的文件,所有函数都以 $_FILES['file']['tmp_name'] 作为参数传递。

因此,当我决定上传图像文件(例如 sample.JPG)时,出现了这个问题,我认为这些文件中的大多数都是来自相机的原始文件<-尽管我是这么认为的,但更重要的是我可以上传它们。 JPG、.jpg、jpeg、.png。除了.JPG之外,所有这些都可以正常工作。

主要问题是 $_FILES 中的字段 ['tmp_name'] 在上传 .JPG 时没有值。

遇到此问题的任何人都请分享您的解决方法或“您是如何做到的”之类的事情。

4

7 回答 7

49

如果$_FILES[$field]['tmp_name']为空,则文件尚未上传。你应该看看$_FILES[$field]['error']为什么。

FWIW,据我了解,mime-type in$_FILES[]是由浏览器提供的。

更新:这里有一些盆栽代码来处理所有文件上传错误:

        $message = 'Error uploading file';
        switch( $_FILES['newfile']['error'] ) {
            case UPLOAD_ERR_OK:
                $message = false;;
                break;
            case UPLOAD_ERR_INI_SIZE:
            case UPLOAD_ERR_FORM_SIZE:
                $message .= ' - file too large (limit of '.get_max_upload().' bytes).';
                break;
            case UPLOAD_ERR_PARTIAL:
                $message .= ' - file upload was not completed.';
                break;
            case UPLOAD_ERR_NO_FILE:
                $message .= ' - zero-length file uploaded.';
                break;
            default:
                $message .= ' - internal error #'.$_FILES['newfile']['error'];
                break;
        }
        if( !$message ) {
            if( !is_uploaded_file($_FILES['newfile']['tmp_name']) ) {
                $message = 'Error uploading file - unknown error.';
            } else {
                // Let's see if we can move the file...
                $dest .= '/'.$this_file;
                if( !move_uploaded_file($_FILES['newfile']['tmp_name'], $dest) ) { // No error supporession so we can see the underlying error.
                    $message = 'Error uploading file - could not save upload (this will probably be a permissions problem in '.$dest.')';
                } else {
                    $message = 'File uploaded okay.';
                }
            }
        }
于 2013-01-23T05:04:22.340 回答
19

检查你的php.ini,特别是这个设置

; Maximum allowed size for uploaded files.
; http://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize
upload_max_filesize = 6M

或者在您的 Apache Config 中执行此操作:

<Directory "/var/www/vhosts/path/to/your/directory/import/">
    php_value post_max_size 6M
    php_value upload_max_filesize 6M
</Directory>

我还要说,如果您上传的文件大于您的 php.iniupload_max_filesize设置,PHP 不会在错误日志中报告错误,这很糟糕。例如,如果您在将其设置为2M(我认为这是默认设置)时上传了一个 6MB 的文件。

于 2014-01-16T10:19:25.970 回答
5

发布答案,因为我的评分太低。

请记住在 php.ini 中设置最大文件大小上限后重新启动服务器。我在这个问题上花了几个小时认为这不是文件大小问题,同时我忘记了重新启动。重新启动后一切正常。

我希望这可以帮助某人。

于 2015-02-03T16:16:22.167 回答
3

我遇到了同样的问题,并且对 .NET 平台的熟悉让你忘记了客户端 html 中发生的事情。

我的问题是我的表单有一个 MAX_FILE_SIZE 隐藏输入,它的值小于文件的等效字节。

你的表格应该有这个;

除此之外,您的表单标签必须包含enctype="multipart/form-data"

我认为最大文件大小以 kb 为单位,但它以字节为单位,这要归功于 stackoverflow 中的其他页面。

可能导致此问题的另一个原因是人们在之前的评论中提到的 php.ini 设置。您也应该可以post_max_size = 200M到 php.ini 文件。

如果您像我一样在 Windows 上进行开发,您可以在 C:\Windows\Temp 看到一个显示错误的转储文件,称为“php**VERSION**_errors.log”。它有助于。

于 2014-05-21T02:10:04.217 回答
1

Seems as though it's a random problem because while I was making a script to upload CSV files, some CSV files would have no problem uploading but in other cases, $_FILES['file'][tmp_name] would be empty.

于 2013-06-07T12:24:16.127 回答
1

我遇到了 $_FILES 字段 'tmp_name' 对 .JPG 文件扩展名没有价值的问题,并通过几个步骤成功修复了它。这些措施将来可能会对某人有所帮助。

  1. 首先,我实现了用户“staticsan”提供的 Switch Case 解决方案。链接在这里 - https://stackoverflow.com/a/14472801/3681985。该解决方案帮助我跟踪了潜在问题,例如 php.ini 文件和文件夹权限中的参数。
  2. php.ini 文件被命名为 php.ini.default。更改参数 upload_max_filesize 和 post_max_size 没有产生任何结果,直到我将文件重命名为 php.ini。请记住对参数值进行试验。
  3. 修复文件名问题后,我遇到了对必须移动上传的临时图像的文件夹的权限的挑战。我已经更改了权限,并且能够看到上传到文件夹中的图像。
于 2015-12-29T06:31:43.017 回答
0

试试这个,看看会发生什么,

if (($_FILES['file']['type']) == "image/jpg" || ($_FILES['file']['type']) == "image/jpeg") {
                      //do uploading stuff here
                    }else{
                    echo 'File is not a valid JPG,JPEG';
                    }
于 2013-01-23T07:28:33.163 回答