猿问

PHP 的 base 64_decode 不会将 base 64 字符串转换为真正可用的图像文件

大家好,我成功找到了一种方法,该方法声称可以在 JavaScript 中将文件输入文件转换为 base 64 字符串,因此我成功发送了该 base 64


JSON 通过 AJAX 和 base 64 编码的字符串看起来像这样发送在 JSON 方法 "photo":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wB 等......"


所以当 base 64 字符串到达 PHP 文件时。PHP 很神奇并成功地将文件存储在我希望文件所在的目标文件夹中,所以当我查看该文件夹时,有一个文件但是


当我尝试打开照片文件进行查看时,照片查看器应用程序会显示类似 image.jpg 的内容,看起来我们不支持此文件格式,而在其他照片查看器应用程序中,它会显示一些内容


与此类似,所以我做错了什么?


这是我的代码


索引.php


<style>


#photo-input{

display: block;

margin-bottom: 50px;

}


</style>


<script>


document.addEventListener('DOMContentLoaded',function(){


document.querySelector('#submit').addEventListener('click',function(){


var photo_input= document.querySelector('#photo-input').files[0];


//Convert #photo-input content into a base 64 string

var reader = new FileReader();

reader.readAsDataURL(photo_input);


reader.onload = function (){

var photo_input_result= reader.result;

sendUploadInfo(photo_input_result);

}

//


});


function sendUploadInfo(photo_input_result){


var photo= photo_input_result;


//<JSON data>


var upload_info = {

    first_name: "John",

    last_name: "Smith",

    photo: photo

};


//</JSON data>


var upload_info_json_object= 'upload_info_json_object='+JSON.stringify(upload_info); 


//<AJAX>

var xhr= new XMLHttpRequest();

xhr.onreadystatechange= function(){


if(xhr.readyState == 4){


document.querySelector('#output').innerHTML= xhr.responseText;


}

}


xhr.open('POST','x');

xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

xhr.send(upload_info_json_object);

//</AJAX>

}


});


</script>


<input type='file' id='photo-input'>


<button id='submit'>Send JSON data</button>


<div id='output'></div>


繁华开满天机
浏览 134回答 3
3回答

慕慕森

我认为您应该完全放弃当前的方法,并用以下方法替换它:<form action="x.php" method="post" enctype="multipart/form-data">&nbsp; <input type="hidden" name="first_name" value="John" />&nbsp; <input type="hidden" name="last_name" value="Smith" />&nbsp; <input type="file" name="photo" accept="image/*" />&nbsp; <input type="submit" value="Upload Photo" /></form>然后,在您的服务器端代码上,像这样检查结果:<?php&nbsp; print_r($_POST); // All of your post fields&nbsp; print_r($_FILES); // All of the file uploads看看move_uploaded_file()什么时候知道你想把它放在哪里。有很多好处:一个真正的二进制文件上传,没有 33% 的 base-64 的浪费和开销,也没有每一方的 CPU 来处理它只接受图像 (&nbsp;accept="image/*")的图像输入表单可以由屏幕阅读器和其他浏览器控件提交,而不仅仅是一些没有上下文的按钮根本不需要 JavaScript!标准流式上传,以减少服务器上的内存使用量。不需要对潜在的巨大 JSON blob 进行编码/解码。

江户川乱折腾

布拉德指出了一种更有效的方法,但是按照您的代码,我看到您保留了字符串而不是 base64_decode 的结果。改变//Photo upload section$photo=$upload_info_json_object->photo;base64_decode($photo);为了//Photo upload section$photo=$upload_info_json_object->photo;$photo=base64_decode($photo);
随时随地看视频慕课网APP
我要回答