【问题标题】:php://input Uplaod image with image typephp://input 上传图片类型为图片
【发布时间】:2017-06-30 01:46:52
【问题描述】:

我正在使用 ajax 调用实现 拖放图片上传器, 我看到了一个关于这个的教程并像这样实现,使用这个代码我只能将图像保存为 .jpg 格式! (或我在代码中指定的任何一种格式)

上传的图片之前保存在 php://input 文件夹中,我们需要从该临时文件夹中抓取该图片以将其保存在服务器中,

但他们没有告诉任何东西根据图像类型更改图像格式,

现在我想上传原始格式的图片,如何在上传时收集图片信息?

这里是代码

    <?php
        $str =file_get_contents('php://input');
        $filename = md5(time()).'.jpg';
        $path = 'upload/'.$filename;
        file_put_contents($path,$str);
        echo $path;

这里是一些用于获取图像和发送 ajax 请求的 JS:

    $(function(){

        //select the drop container
        var obj = $('.drop');

        // dragover event listener
        obj.on('dragover',function(e){
            e.stopPropagation();
            e.preventDefault();
            $(this).css('border',"2px solid #16a085");
        });

        //drop event listener
        obj.on('drop',function(e){
            e.stopPropagation();
            e.preventDefault();
            $(this).css('border',"2px dotted #bdc3c7");

            //get the files
            var files = e.originalEvent.dataTransfer.files;
            var file =files[0];
            //console.log(file);

            //upload data using the xhr object
            upload(file);

        });

        function upload(file){

            //create xhr object
            xhr = new XMLHttpRequest();

            //initiate request
            xhr.open('post','drop.php',true);

            //set headers
            xhr.setRequestHeader('Content-Type',"multipart/form-data");
            xhr.setRequestHeader('X-File-Name',file.fileName);
            xhr.setRequestHeader('X-File-Size',file.fileSize);
            xhr.setRequestHeader('X-File-Type',file.fileType);

            //send the file
            xhr.send(file);
        }

    });

【问题讨论】:

  • 您在标题X-File-Type 中发送文件类型,因此请尝试使用:$_SERVER['HTTP_X_FILE_TYPE']
  • 不行,我刚才试过了,不用扩展就保存了!
  • 你说的“保存而不扩展”是什么意思?使用 var_dump($_SERVER) 检查该标头包含的内容。它可能是 mime 类型而不是扩展名。
  • 它正在将文件保存为 _some_random_hashed_file_name_.undefined
  • 1.再次转储 $_SERVER 并查看它包含的内容。它可能是 mime 类型而不是扩展名。 2. 设置标题时,检查控制台中file.fileType 包含的内容。 3.再看我的第一条评论,我拼错了标题名称但是已经更新了。

标签: php jquery ajax drag-and-drop image-uploading


【解决方案1】:

最后,我解决了这个问题。

PHP 捕获标头没有问题,正如 Magnus Eriksson 所说,$_SERVER['HTTP_X_FILE_TYPE'] 工作正常,但问题是 在发送 ajax 时header 我们设置的 header 类型和大小错误。

我记录了文件数据并找到 typesize 但我将标题设置为 fileTypefileSize

更改了代码,这是之前和之后的代码:

之前: AJAX 请求:

//设置标题
xhr.setRequestHeader('Content-Type',"multipart/form-data");
xhr.setRequestHeader('X-File-Name',file.fileName);
xhr.setRequestHeader('X-File-Size',file.fileSize);
xhr.setRequestHeader('X-File-Type',file.fileType);

和 PHP:

$str =file_get_contents('php://input');
$filename = md5(time()).'.jpg';
$path = 'upload/'.$filename;
file_put_contents($path,$str);
echo $path;

之后: AJAX 请求:

//设置标题
xhr.setRequestHeader('Content-Type',"multipart/form-data");
xhr.setRequestHeader('X-File-Name',file.fileName);
xhr.setRequestHeader('X-File-Size',file.size);
xhr.setRequestHeader('X-File-Type',file.type);

和 PHP:

$str =file_get_contents('php://input');
$ext = $_SERVER['HTTP_X_FILE_TYPE'];
$e = explode("/",$ext);
$ext = $e[1];
$filename = md5(time()).'.'.$ext;
$path = 'upload/'.$filename;
file_put_contents($path,$str);
echo $path;

这段代码运行良好:)

【讨论】:

    猜你喜欢
    • 2014-05-10
    • 2016-10-12
    • 2011-03-16
    • 2013-04-29
    • 2012-11-08
    • 2014-07-05
    • 1970-01-01
    相关资源
    最近更新 更多