php - 使用 PHP 将图像上传到 MySQL (blob)
问题描述
出于安全原因,我决定将用户个人资料图像上传到数据库,而不仅仅是一个文件夹并上传图像地址,这将是一个好主意。
我以前从未在后端处理过文件上传,但是从各种来源阅读了这一点,我相信我做的一切都是正确的。但是,没有上传有用的二进制数据。
在 php.ini 中
文件上传=开启
在前端
<form enctype="multipart/form-data" method="post" autocomplete="on" action="upload/">
<p>
<input type="file" id="avatar" name="avatar" accept="image/png, image/jpeg" required />
<label for="avatar">*Profile photo</label>
</p>
<p class="submitter two-thirds columns">
<input type="submit" value="Apply" />
</p>
</form>
在后端
if(isset($_SESSION['id']))
$UserID = $_SESSION['id'];
else exit(1);
if (!empty($_FILES['avatar'])){
$photo = fopen($_FILES['avatar']["tmp_name"], 'rb');
$photo_mime = $_FILES['avatar']["type"];
}
else exit(1);
$values_data = array(
$UserID,
$photo,
$photo_mime,
);
$sql = "INSERT INTO `user`
(
UserID,
photo,
photo_mime
)
VALUES
(
:UserID,
:photo,
:photo_mime
)
ON DUPLICATE KEY UPDATE
photo = :photo,
photo_mime = :photo_mime
";
$sth = $dbh->prepare($sql);
$sth->bindValue(':UserID', $values_data[0]);
$sth->bindValue(':photo', $values_data[1]);
$sth->bindValue(':photo_mime', $values_data[2]);
$sth->execute();
并且数据库确实获得了一些信息
然而,这些图像二进制文件都是 1KB。看看里面他们有这样的数据
资源 ID #13
所以二进制文件被弄乱了或被丢弃在某个地方......但是在哪里?
解决方案
fopen()
不返回文件的内容。它返回一个文件指针资源,然后您可以将其传递给fread()之类的东西来获取内容。
就像是:
$handler = fopen($_FILES['avatar']["tmp_name"], 'r');
$file = fread($handler, filesize($_FILES['avatar']["tmp_name"]));
fclose($handler);
更简单的方法是使用file_get_contents():
$file = file_get_contents($_FILES['avatar']["tmp_name"]);
这将在一行中为您提供内容。
推荐阅读
- php - PHP文件停止工作,没有对其进行任何更改
- javascript - 如何将构造函数值传递到 DOM
- java - 为什么即使存在 csv 文件也会出现 FileNotFoundException?
- python - tensorflow evalutaion 和 earlystopping 给出了无穷大的溢出错误
- functional-programming - 难以理解 OCAML 幂函数
- visual-studio-code - vscode集成终端重音不起作用?
- javascript - 松露合约部署卡住
- python - 从另一个列表中的一个列表中获取第一项
- java - 在多模块多数据源项目中指示将哪个数据源注入我的 DAO 的正确方法是什么?
- spring-boot - 角色列未出现在 Postgresql 表中