在多个文件上传时压缩图像文件大小

时间:2013-12-01 17:33:45

标签: php upload compression filesize

我使用以下作为html输入:

<input type="file" name="files[]" multiple="multiple" accept="image/*">

然后这将上传上述输入的多个实例并尝试通过在检查每个文件的错误后更改图像质量进行压缩:

$valid_formats = array("jpg", "png", "gif", "zip", "bmp");
$max_file_size = 1024*300; //300 kb
$path = "uploads/"; // Upload directory
$count = 0;

if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
        // Loop $_FILES to execute all files
    foreach ($_FILES['files']['name'] as $f => $name) {     
        if ($_FILES['files']['error'][$f] == 4) {



// Compress the image files
function compress_image($source_url, $destination_url, $quality) {
    $info = getimagesize($source_url);

    if ($info['mime'] == 'image/jpeg') $image = imagecreatefromjpeg($source_url);
    elseif ($info['mime'] == 'image/gif') $image = imagecreatefromgif($source_url);
    elseif ($info['mime'] == 'image/png') $image = imagecreatefrompng($source_url);

    // save file
    imagejpeg($image, $destination_url, $quality);

    // return destination file
    return $destination_url;
}

                compress_image($_FILES['files']['name'], NULL, 90);

            continue; // Skip file if any error found
        }          
        if ($_FILES['files']['error'][$f] == 0) {              
            if ($_FILES['files']['size'][$f] > $max_file_size) {

                $message[] = "$name is too large!.";
                continue; // Skip large files
            }
            elseif( ! in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ){
                $message[] = "$name is not a valid format";
                continue; // Skip invalid file formats
            }
            else{ // No error found! Move uploaded files 
                if(move_uploaded_file($_FILES["files"]["tmp_name"][$f], $path.$name)) {
                    $count++; // Number of successfully uploaded files
                }
            }
        }
    }
}

文件上传得很好,但压缩不会发生。如何在上传或每个文件时压缩图像文件大小?

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的那样,您在错误4中调用compress_image,这对您没有太大帮助,因为只有在没有上传图片的情况下才会这样做。

此外,您不会将compress_image函数调用作为目标。您传递NULL,如果实际运行,它将实际将压缩图像发送到浏览器。

这个功能正常但不完整的示例假设您要丢弃大于maxsize的图像。任何较小的文件都被重新保存为90质量的jpeg。

<?php
//I removed the zip entry as you don't have any code to handle them here.
$valid_formats = array("jpg", "png", "gif");
//Edit: compress_image doesn't handle bmp files either, though it would
//easy enough to add with another elseif.
$max_file_size = 1024*300; //300 kb
$path = "uploads/"; // Upload directory
$count = 0;

// Compress the image files
function compress_image($source_url, $destination_url, $quality) {
    $info = getimagesize($source_url);

    if ($info['mime'] == 'image/jpeg') $image = imagecreatefromjpeg($source_url);
    elseif ($info['mime'] == 'image/gif') $image = imagecreatefromgif($source_url);
    elseif ($info['mime'] == 'image/png') $image = imagecreatefrompng($source_url);

    // save file
    imagejpeg($image, $destination_url, $quality);

    // return destination file
    return $destination_url;
}

if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
        // Loop $_FILES to execute all files
    foreach ($_FILES['files']['name'] as $f => $name) {     
        if ($_FILES['files']['error'][$f] != 0) {
            continue; // Skip file if any error found
        }
        if ($_FILES['files']['error'][$f] == 0) {
            if ($_FILES['files']['size'][$f] > $max_file_size ) {
                $message[] = "$name is too large!";
                continue; // Skip large files.
            }
            elseif( ! in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ){
                $message[] = "$name is not a valid format";
                continue; // Skip invalid file formats
            }
            else{ // No error found! Move uploaded files 
                //All smaller files to be compressed.
                if(is_uploaded_file($_FILES["files"]["tmp_name"][$f])) {
                    //Add a '.jpg' to the name because I'm lazy.
                    compress_image($_FILES["files"]["tmp_name"][$f], $path.basename($name).'.jpg', 90);
                    $count ++; // Number of successfully uploaded files
                }
            }
        }
    }
}
相关问题