【问题标题】:PHP Image Upload Not Resizing When Sent Via JS通过JS发送时PHP图像上传未调整大小
【发布时间】:2015-07-13 02:19:03
【问题描述】:

我在上传通过 JS 发送到 PHP 的图像时遇到问题。我可以很好地上传图片,但我会在将图片移动到新目的地之前调整大小。我也可以毫无问题地重命名图像。这真的只是调整大小是这里的问题。

经过大量搜索后,我在 SO 上看到了很多关于此的问题,这就是我如何到达现在的位置,但没有一个能 100% 回答这个问题。如果您知道SO 上已有的问题/答案,请将我链接到正确的文章。

非常感谢任何帮助,谢谢。

这里是 JS

        var test = document.querySelector('#afile');
        test.addEventListener('change', function() {
            var file = this.files[0];

            var fd = new FormData();
            fd.append('afile', file);
            // These extra params aren't necessary but show that you can include other data.
            fd.append('id', burgerId);

            var xhr = new XMLHttpRequest();
            // why wont this work in the actions directory?
            xhr.open('POST', 'actions/upload.php', true);

            xhr.upload.onprogress = function(e) {
                if (e.lengthComputable) {
                    var percentComplete = (e.loaded / e.total) * 100;
                    var uploadProcess = document.getElementById('uploadProcess');
                    uploadProcess.setAttribute('style', 'width: ' + percentComplete + '%;');
                    // uploadProcess.innerHTML = parseInt(percentComplete) + '% uploaded';
                }
            };

            xhr.onload = function() {
                if (this.status == 200) {
                    var resp = JSON.parse(this.response);

                    image = 'img/' + resp.newFileName;
                    sessionStorage.setItem('burgerLoc', image);

                    var image = document.createElement('img');
                    image.src = resp.dataUrl;
                    document.body.appendChild(image);
                };
            };

            xhr.send(fd);
            // upImage(id)
        }, false);

这是标记

<input type="file" name="afile" id="afile" accept="image/*"/>

这里是 PHP

$image = $_FILES['afile']['name'];
$image_tmp = $_FILES['afile']['tmp_name'];
$image_type = $_FILES['afile']['type'];

function getName($str) {
    $parts = explode('.',$str);
    $imgName = str_replace(' ', '_',$parts[0]);
    return $imgName;
}
function getExtension($str) {
    $parts = explode('.',$str);
    $ext = $parts[1];
    return $ext;
}

$image_name = stripslashes($image);
$name = getName($image_name);
$image_ext = getExtension($image_name);
$ext = strtolower($image_ext);

if($ext == 'jpg' || $ext == 'jpeg' ) {
    $ext = 'jpg';
    $src = imagecreatefromjpeg($image_tmp);
} else if($ext == 'png') {
    $src = imagecreatefrompng($image_tmp);
} else {
    $src = imagecreatefromgif($image_tmp);
}

$file_content = file_get_contents($image_tmp);
$data_url = 'data:' . $image_type . ';base64,' . base64_encode($file_content);

list($width,$height) = getimagesize($image_tmp);

// width of the main image
$new_width = 748;
$new_height = ($height / $width) * $new_width;
$img_dest = imagecreatetruecolor($new_width,$new_height);

imagecopyresampled($img_dest,$src,0,0,0,0,$new_width,$new_height,$width,$height);

// rename the file
$new_file_name = strtolower($_REQUEST['id'] . '.' . $ext);
$new_file_location = '../img/' . $new_file_name;

imagejpeg($img_dest,$new_file_name,100);

move_uploaded_file($image_tmp, $new_file_location);

imagedestroy($src);
imagedestroy($img_dest);

$json = json_encode(array(
    'dataUrl' => $data_url,
    'extension' => $ext,
    'id' => $_REQUEST['id'],
    'name' => $image,
    'newFileName' => $new_file_name,
    'type' => $image_type
));

echo $json;

【问题讨论】:

  • 图像根本没有调整大小。图片上传,获取新名称并存储在服务器上,但它的存储大小与上传的图片相同,而不是所需的新尺寸。

标签: javascript php upload image-uploading image-resizing


【解决方案1】:

我可能会尝试在您的 linux 发行版中安装 ImageMagick 并尝试使用此功能来调整图像大小

http://php.net/manual/en/imagick.resizeimage.php

我已经在我的网络服务器上复制了你的脚本...我做了修改并想出了这个。

最重要的修改是我在文件位置中使用了确切的路径,并且我正在将 tmp 文件移动到真实文件,加载该真实文件,调整该真实文件的大小,而不是尝试使用 tmp上传文件。

PHP:

    <?php
    $image = $_FILES['afile']['name'];
    $image_tmp = $_FILES['afile']['tmp_name'];
    $image_type = $_FILES['afile']['type'];

    function getName($str) {
        $parts = explode('.',$str);
        $imgName = str_replace(' ', '_',$parts[0]);
        return $imgName;
    }
    function getExtension($str) {
        $parts = explode('.',$str);
        $ext = $parts[1];
        return $ext;
    }

    $image_name = stripslashes($image);
    $name = getName($image_name);
    $image_ext = getExtension($image_name);
    $ext = strtolower($image_ext);
    $outputfolder = "/var/www/html/wp-content/";
    $new_file_name = strtolower($_REQUEST['id'] . '.' . $ext);
    $new_file_location = $outputfolder.$new_file_name;
    move_uploaded_file($image_tmp, $new_file_location);

    if($ext == 'jpg' || $ext == 'jpeg' ) {
        $ext = 'jpg';
        $src = imagecreatefromjpeg($new_file_location);
    } else if($ext == 'png') {
        $src = imagecreatefrompng($new_file_location);
    } else {
        $src = imagecreatefromgif($new_file_location);
    }

    list($width,$height) = getimagesize($new_file_location);

    // width of the main image
    $new_width = 748;
    $new_height = ($height / $width) * $new_width;
    $img_dest = imagecreatetruecolor($new_width,$new_height);

    imagecopyresampled($img_dest,$src,0,0,0,0,$new_width,$new_height,$width,$height);
    $resizedLocation = $outputfolder."resized_".$new_file_name;
    imagejpeg($img_dest,$resizedLocation,100);
    imagedestroy($src);
    imagedestroy($img_dest);


    $file_content = file_get_contents($resizedLocation);
    $data_url = 'data:image/jpeg;base64,' . base64_encode($file_content);

    $json = json_encode(array(
        'dataUrl' => $data_url,
        'extension' => $ext,
        'id' => $_REQUEST['id'],
        'name' => $image,
        'newFileName' => $new_file_name,
        'type' => $image_type
    ));

    echo $json;
    ?>

您的 HTML/JS 保持不变。

现在这对我来说完美无缺,你唯一需要确保的是 $outputfolder 可由 linux 用户写入,执行 php 脚本的 webeserver 在其下运行(通常是 web-data...)

我的网络服务器:

  • CentOS Linux 版本 7.0.1406(核心)
  • php.x86_64 5.4.16-23.el7_0.3
  • apache x86_64 2.4.6

【讨论】:

  • 我不熟悉 ImageMagick,它会在我的 PHP 脚本中取代什么?
  • 我得试试看,谢谢!我只是很好奇为什么你会朝这个方向而不是我前进的方向?还想知道您是否知道为什么我尝试的方向不起作用?
  • 哦。我只是注意到我没有看到正在使用 ImageMagick 函数……再次感谢,我稍后再试一下!
  • 这确实成功了!尽管我确实注意到您的代码正在保存两个图像。一种以$new_file_name 命名,另一种以"resized_" . $new_file_name 命名。当我从代码中删除"resized_" . 位时,我只会得到一个名称正确的已保存图像。很好奇,我不确定为什么要保存两张图片...
  • 啊,明白了。再次感谢!
猜你喜欢
  • 2013-09-19
  • 2016-04-26
  • 2014-03-14
  • 1970-01-01
  • 2011-01-10
  • 2019-02-10
  • 1970-01-01
  • 2020-04-12
相关资源
最近更新 更多