为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
繁华开满天机 2021-10-08 14:31:18
大家好,我成功找到了一种方法,该方法声称可以在 JavaScript 中将文件输入文件转换为 base 64 字符串,因此我成功发送了该 base 64JSON 通过 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 stringvar 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>
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

我认为您应该完全放弃当前的方法,并用以下方法替换它:


<form action="x.php" method="post" enctype="multipart/form-data">

  <input type="hidden" name="first_name" value="John" />

  <input type="hidden" name="last_name" value="Smith" />

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

  <input type="submit" value="Upload Photo" />

</form>

然后,在您的服务器端代码上,像这样检查结果:


<?php

  print_r($_POST); // All of your post fields

  print_r($_FILES); // All of the file uploads

看看move_uploaded_file()什么时候知道你想把它放在哪里。

有很多好处:

  • 一个真正的二进制文件上传,没有 33% 的 base-64 的浪费和开销,也没有每一方的 CPU 来处理它

  • 只接受图像 ( accept="image/*")的图像输入

  • 表单可以由屏幕阅读器和其他浏览器控件提交,而不仅仅是一些没有上下文的按钮

  • 根本不需要 JavaScript!

  • 标准流式上传,以减少服务器上的内存使用量。

  • 不需要对潜在的巨大 JSON blob 进行编码/解码。


查看完整回答
反对 回复 2021-10-08
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

布拉德指出了一种更有效的方法,但是按照您的代码,我看到您保留了字符串而不是 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);


查看完整回答
反对 回复 2021-10-08
  • 3 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信