【问题标题】:Get width and height of an image before uploading在上传之前获取图像的宽度和高度
【发布时间】:2015-08-29 16:06:08
【问题描述】:

我一直在尝试这段代码:

$file_tmp = $_FILES['video_imagen']['tmp_name'];
list($width, $height) = getimagesize($file_tmp);

但它给了我一个错误。我无法修复它

更新

这里有我开发的 PHP 代码。我该如何解决。我一直在不同的论坛寻找解决方案...

我收到此错误

注意:getimagesize(): 读取错误!在 C:\wamp\www\tapeHD\include\php\database.php 第 282 行

    public static function SubirVideo($titulo, $video_directorio, $imagen_directorio, $user, $descripcion){
        //ID AUTO INCREMENT
        $sql = "INSERT INTO video(nombre, directorio, imagen, visitas, likes, usuario_id, fecha_subida, descripcion) VALUES ($titulo, $video_directorio, $imagen_directorio, 0, 0, $user, NOW(), $descripcion)";
        $resultado = self::Conexion($sql);
        return $resultado;
    }

    public static function SubirVideoErrores(){
        $error = "";

        if(isset($_POST["boton_upload_video"])){
            $uploadImagen = $_FILES['video_imagen']['name'];
            $tipoImagen = $_FILES['video_imagen']['type'];

            $uploadVideo = $_FILES['video_file']['name'];
            $tipoVideo = $_FILES['video_file']['type'];

            $titulo = $_POST["video_title"];
            $descripcion = $_POST["video_description"];

            $directorio = $_SERVER['DOCUMENT_ROOT']."/tapeHD/include/database/usuarios/".$_SESSION["usuario"]."/videos";

            if($tipoImagen == "image/jpeg"){
                $file_tmp = $_FILES['video_imagen']['tmp_name'];
                list($width, $height) = getimagesize($file_tmp);

                if($_FILES['video_imagen']['size'] < (1024000)){
                    if($width != 320 && $height != 180){
                        $error = "<div id='error_alert'><div class='error_container'><i class='fa fa-times awesome error_close btn'></i><div class='error_text'>La imagen debe de ser 320x180</div></div></div>";
                    } else {
                        if($tipoVideo == "video/mp4"){
                            move_uploaded_file($_FILES['video_file']['tmp_name'], $directorio."/".$uploadVideo);
                            move_uploaded_file($_FILES['video_imagen']['tmp_name'], $directorio."/".$uploadImagen);
                            $video_directorio = "include/database/usuarios/".$_SESSION["usuario"]."/videos/".$uploadVideo;
                            $imagen_directorio = "include/database/usuarios/".$_SESSION["usuario"]."/videos/".$uploadImagen;
                            DataBase::SubirVideo($titulo, $video_directorio, $imagen_directorio, $_SESSION["usuario"], $descripcion);
                            $error = "<div id='error_alert'><div class='error_container'><i class='fa fa-times awesome error_close btn'></i><div class='error_text'>Tu video ha sido subido</div></div></div>";
                        } else {
                            $error = "<div id='error_alert'><div class='error_container'><i class='fa fa-times awesome error_close btn'></i><div class='error_text'>El video debe estar en formato .mp4</div></div></div>";
                        }
                    }
                } else {
                    $error = "<div id='error_alert'><div class='error_container'><i class='fa fa-times awesome error_close btn'></i><div class='error_text'>La imagen pesa demasiado</div></div></div>";
                }
            } else {
                $error = "<div id='error_alert'><div class='error_container'><i class='fa fa-times awesome error_close btn'></i><div class='error_text'>La imagen debe ser .jpg </div></div></div>";
            }
        }
        return $error;  
    }

HTML

            <div class="upload_video_fields">
                <div class="container">
                    <form action="upload.php" method="POST" enctype="multipart/form-data">
                        <div class="video_form left">
                            <input type="text" id="video_title" name="video_title" placeholder="Título del video..." required />
                            <textarea id="video_description" name="video_description" placeholder="Descripción del video..." cols="40" rows="6" aria-required="true" required></textarea>

                        </div>

                        <div class="video_form right">
                            <input type="file" id="video_imagen" name="video_imagen" required />

                            <input type="file" id="video_file" name="video_file" required />
                        </div>
                        <input type="submit" id="boton_upload_video" name="boton_upload_video" class="btn" value="Subir" />
                    </form>
                </div>

                <div class="upload_progress"><div class="bar"></div></div>
            </div>

【问题讨论】:

  • 不,这是不可能的。该文件首先通过 $_FILES 全局访问,其次在上传后可用。文件上传后,返回大小很简单,但不是在 afaik 之前!
  • 那么,如何检查图像的尺寸是否为 320x180?
  • 您到底想在哪里进行尺寸检查?
  • 提交/上传后,您可以检查,如果需要,您可以将其调整为这些尺寸
  • 等一下。您是否尝试在未用于执行实际上传的脚本中使用 $_FILES 数组? database.php 看起来像一个奇怪的脚本文件名来执行实际的上传过程????

标签: php file-upload


【解决方案1】:

对于多个文件上传,以下内容来自手册 - 以防万一您没有找到它。我希望这可以在上传后尝试访问变量时提供足够的指导。

-----------------------------------
Example #1 Uploading multiple files
-----------------------------------
<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Send these files:<br />
  <input name="userfile[]" type="file" /><br />
  <input name="userfile[]" type="file" /><br />
  <input type="submit" value="Send files" />
</form>

当提交上述表单时,数组$_FILES['userfile']$_FILES['userfile']['name']$_FILES['userfile']['size'] 将被初始化。每一个都将是一个数字索引数组,其中包含相应的值提交文件。

例如,假设文件名/home/test/review.html/home/test/xwp.out 已提交。在这种情况下,$_FILES['userfile']['name'][0] 将包含值 review.html,而$_FILES['userfile']['name'][1] 将包含值 xwp.out

同样,$_FILES['userfile']['size'][0] 将包含review.html 的文件大小,等等。

【讨论】:

  • 非常感谢,这是我想知道的
【解决方案2】:

Subirvideo 函数中的 sql 看起来不正确,因为所有值都没有引号。从技术上讲,整数值周围不需要引号,但不会造成任何伤害。我在 sql 中添加了 exit 语句,以便您可以检查结果,尽管您说现在很好。主要方法SubirVideoErrores 有一些额外的代码来调整上传的图片到指定的最大尺寸(同时希望保持纵横比)

public static function SubirVideo( $titulo, $video_directorio, $imagen_directorio, $user, $descripcion ){
    /* note: 
       Ensure that $titulo and $descripcion are properly escaped to avoid issues with quote marks etc
    */
    $sql = "INSERT INTO `video` ( `nombre`, `directorio`, `imagen`, `visitas`, `likes`, `usuario_id`, `fecha_subida`, `descripcion` )
            VALUES
            ( '$titulo', '$video_directorio', '$imagen_directorio', '0', '0', '$user', now(), '$descripcion' )";

    /* Remove if the exit( sql ) if it looks correct */
    exit( $sql );
    $resultado = self::Conexion( $sql );
    return $resultado;
}

public static function SubirVideoErrores( $force_resize=true ){
    /* set the default value of $force_resize to false if you do not wish resizing by default */
    try{
        $error = "";

        $max_width=320;
        $max_height=180;

        /* I added this so I could set a var rather than use a session for testing, ie: $session_usuario='antonio' etc */
        $session_usuario=$_SESSION["usuario"];

        if( isset( $_POST["boton_upload_video"] ) ){

            $titulo = $_POST["video_title"];
            $descripcion = $_POST["video_description"];

            $uploadImagen = $_FILES['video_imagen']['name'];
            $tipoImagen = $_FILES['video_imagen']['type'];
            $uploadVideo = $_FILES['video_file']['name'];
            $tipoVideo = $_FILES['video_file']['type'];

            /* Check for errors */
            $video_upload_error = intval( $_FILES['video_file']['error'] );
            $image_upload_error = intval( $_FILES['video_imagen']['error'] );

            if( $video_upload_error > 0 or $image_upload_error > 0 ){
                exit('There were errors during the upload process');    
            }

            if( !empty( $uploadVideo ) && !empty( $uploadImagen ) ){

               $directorio = $_SERVER['DOCUMENT_ROOT']."/tapeHD/include/database/usuarios/".$session_usuario."/videos";
               #$directorio = 'c:/temp/uploads_testing';

                if( $tipoImagen !== "image/jpeg"){
                    $error = "<div id='error_alert'><div class='error_container'><i class='fa fa-times awesome error_close btn'></i><div class='error_text'>La imagen debe ser de formato .jpg</div></div></div>";
                    print $error;

                } else {

                    list( $width, $height, $type, $attr ) = getimagesize( $_FILES["video_imagen"]["tmp_name"] );

                    if( $force_resize==true ){
                        /* Resize supplied mage to a maximum of 320x180 if it is larger then these sizes */
                        if( $width > $max_width or $height > $max_height ) {
                            if( $width > $height ){
                                /* landscape */
                                $aspect = $max_width / $width;
                                $new_width = $max_width;
                                $new_height = $height * $aspect;
                            } elseif( $width == $height ){
                                /* square */
                                $new_width=$max_height;
                                $new_height=$max_height;
                            } else {
                                /* portrait */
                                $aspect = $max_height / $height;
                                $new_width = $width * $aspect;
                                $new_height = $max_height;  
                            }

                            $uploadedimgpath=$directorio."/".$uploadImagen;

                            move_uploaded_file( $_FILES['video_file']['tmp_name'], $directorio."/".$uploadVideo );
                            move_uploaded_file( $_FILES['video_imagen']['tmp_name'], $uploadedimgpath );                        

                            $image = @imagecreatetruecolor( $new_width, $new_height );
                            $background_color = @imagecolorallocate( $image, 255, 255, 255 );
                            $source = @imagecreatefromjpeg( $uploadedimgpath );

                            @imagecopyresampled( $image, $source, 0, 0, 0, 0, $new_width, $new_height, $width, $height ); 
                            @imagejpeg( $image, $uploadedimgpath, 100 ); 
                            @imagedestroy( $image ); 
                            @imagedestroy( $source );

                            $width=$new_width;
                            $height=$new_height;
                        }
                    } else {
                            $uploadedimgpath=$directorio."/".$uploadImagen;

                            move_uploaded_file( $_FILES['video_file']['tmp_name'], $directorio."/".$uploadVideo );
                            move_uploaded_file( $_FILES['video_imagen']['tmp_name'], $uploadedimgpath );
                    }

                    if( $_FILES['video_imagen']['size'] > 1024000 ){
                        $error = "<div id='error_alert'><div class='error_container'><i class='fa fa-times awesome error_close btn'></i><div class='error_text'>La imagen pesa demasiado</div></div></div>";
                        print $error;

                    } else {

                        if( $width == 320 or $height == 180 ){
                            if( $tipoVideo == "video/mp4" ){

                                $video_directorio = "include/database/usuarios/".$session_usuario."/videos/".$uploadVideo;
                                $imagen_directorio = "include/database/usuarios/".$session_usuario."/videos/".$uploadImagen;

                                DataBase::SubirVideo( $titulo, $video_directorio, $imagen_directorio, $session_usuario, $descripcion );

                                $error = "<div id='error_alert'><div class='error_container'><i class='fa fa-times awesome error_close btn'></i><div class='error_text'>Tu video ha sido subido</div></div></div>";
                                print $error;
                            } else {
                                $error = "<div id='error_alert'><div class='error_container'><i class='fa fa-times awesome error_close btn'></i><div class='error_text'>El video debe estar en formato .mp4</div></div></div>";
                                print $error;
                            }
                        } else {
                            $error = "<div id='error_alert'><div class='error_container'><i class='fa fa-times awesome error_close btn'></i><div class='error_text'>La imagen debe de ser 320x180</div></div></div>";
                            print $error;
                        }
                    }
                }
            }
        }
    }catch( Exception $e ){
        exit( $e->getMessage() );   
    }
}

我已经对此进行了测试,图像和视频都可以在我的系统上正常上传(当然还有一些路径更改)并且两者都是可读的。我可以观看上传的视频并查看上传的图像——即使是那些调整大小的图像。您上传的视频是否很大?

【讨论】:

  • 好的,它工作得很好@RamRaider。它在我的数据库中插入不同的值。问题是我移动的文件会损坏。我不知道为什么。我不能看视频,我什至看不到视频的图片。会是什么?
  • 它的大小是 54MB @RamRaider。顺便说一句,我有 Windows 10,我不知道这是否是问题
  • 您确定upload_max_filesize 设置为足够大的值并且max_execution_time 也设置为足够大?当然 54Mb 似乎并不过分,但您必须确保帖子可以处理超过默认 2Mb 的文件
  • max_execution_time = 120 AND upload_max_filesize = 100M@RamRaider
  • 或使用 php 命令:ini_set('upload_max_filesize',pow( 1024, 100 ) ); 等 ~ 我认为,这将设置 100Mb 的限制。同样对于时间限制,ini_set('max_execution_time',180);ini_set('max_input_time',180);
猜你喜欢
  • 2016-05-08
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多