我可以将 base64 图像添加到 $_FILES 数组吗?

Posted

技术标签:

【中文标题】我可以将 base64 图像添加到 $_FILES 数组吗?【英文标题】:Can I add a base64 image to the $_FILES array? 【发布时间】:2013-07-22 02:12:06 【问题描述】:

有没有办法将 base64 图像字符串添加到 $_FILES 数组(上传文件时获得的数组)?基本上,我想从 base64 字符串伪造文件上传。 base64 字符串来自电子邮件附件。我不想使用file_get_contents(),因为我想将图像作为二进制图像保存在数据库中。我不需要上传它,但我确实需要它成为$_FILES 数组的一部分。

【问题讨论】:

base64 字符串在哪里?在javascript中的客户端? 请提供更多上下文 - 谁/什么正在上传文件? base64 字符串来自电子邮件附件。所以php。 @jcsanyi 所以你已经在 PHP 中得到了它——你要上传到哪里?不同的服务器? 不是来自任何服务器,它只是一个 base64 字符串,都是本地的,但我想“上传”它,所以我需要它在 files 数组中。 @jcsanyi 【参考方案1】:

index.php

// https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL

/* Simple */
function previewImage( image, preview, string )


    var fileImage   = image.files[0];
    var preview     = document.querySelector( preview );

    var reader      = new FileReader();

    reader.addEventListener( "load", function() 

        preview.style.height    = "100";
        preview.title           = fileImage.name;

        // convert image file to base64 string
        preview.src             = this.result;

        /* --- */

        document.querySelector( string ).value = this.result;

    , false );

    if ( fileImage )
    
        reader.readAsDataURL( fileImage );
    



document.querySelector( "#imageID" ).addEventListener( "change", function() 

    previewImage( this, "#imagePreviewID", "#imageStringID" );

 )
/* Simple || */
<form method="post" action="process.php" >

    Title: <input type="text" name="title" /><br />

    File Upload: <input type="file" name="image" id="imageID" /><br />
    Preview: <img src="#" id="imagePreviewID" /><br />
    String base64: <textarea name="imageString" id="imageStringID" rows="10" cols="50" readonly="readonly" ></textarea>

    <hr />

    <input type="submit" name="submit" value="Submit" />

</form>

process.php

<?php

    $data = array(
        "post"  => $_POST,
        "files" => $_FILES
    );

    echo "<pre>";

    // echo json_encode($data);

    var_dump($data);

?>

<img src="<?= $_POST['imageString']; ?>" />

repl.it

【讨论】:

【参考方案2】:

上传是一种将文件内容从客户端(通常是网络浏览器)发送到服务器的方法。听起来你已经在服务器上获得了你需要的数据(PHP),所以你不需要上传它。

    您可以使用base64_decode() 将其从base64 转换为直接文件内容。

    如果您需要将其作为服务器上的文件,您可以使用file_put_contents() 之类的内容将其另存为新文件。

    如果您尝试对 $_FILE 数组中上传的文件执行其他操作,请提供更多详细信息。不管是什么,您都不需要实际上传文件。


$_FILES 数组实际上并不包含文件的内容 - 它包含保存内容的文件名。

如果您必须使用$_FILES 数组(例如,为了重用现有类),您需要使用file_put_contents() 来保存一个新的临时文件,然后手动添加一个条目$_FILES 指向该临时文件的数组(就像修改任何其他数组一样)。完成后不要忘记删除临时文件 - 这通常由 PHP 自动处理,但如果您手动创建文件,您也必须手动删除它。

不过,我强烈建议您重构或为您的类提供替代接口。您不必为了将文件保存到数据库而假装文件已上传。

【讨论】:

就像我说的,我不希望它到 file_put_contents... 因为我需要它“上传”到数据库,而不是在 base64 中。所以我去解码所以它是二进制/图像。我希望它在 $_FILES 数组中。 $_FILES 数组和上传都与数据库无关。 $_FILES 数组只是您访问从浏览器发送给您的文件内容的一种方式。您已经获得了文件的内容,因此您不需要 $_FILES 数组。 我已经建立了一个 php 类,它可以将 $_FILES 数组中的文件添加到数据库中,它会创建一个哈希,等等。我知道我不需要它,我只想要它在 $_FILES 数组中

以上是关于我可以将 base64 图像添加到 $_FILES 数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

将水印添加到图像(Base64)并进行转换

您可以将内联 base64 编码图像添加到 Mandrill 模板吗?

PHP base64_decode 产生无效的图像文件

将 base64 编码图像添加到 Microsoft Word 文档

提供多个 base64 图像以供下载

如何在 Selenium Extent 报告中添加 Base64 图像的缩略图