【问题标题】:PHP - Read content of BLOB filePHP - 读取 BLOB 文件的内容
【发布时间】:2018-10-19 22:14:06
【问题描述】:

我上传了一个 *.mp4 视频,并使用 JavaScript 的 new Blob() 函数将其转换为 Blob type。 我使用 AJAX 将此 Blob 发送到 PHP。

现在我想在 PHP 中读取这个 Blob 的内容。换句话说,我需要这个 Blob 的二进制数据,并希望将其存储到 PHP 变量中。

然而,用 PHP 读取 Blob 文件似乎是不可能的,因为 freadfopenfile_get_contents 都失败了!当我在浏览器中打开 Blob URL 时,视频播放正常。

我的问题是,如何在不安装扩展/库的情况下使用 PHP 获取此 Blob 的二进制数据?

var_dump($_FILES['video']);
Array
(
    [name] => blob
    [type] => video/mp4
    [tmp_name] => C:\xampp\tmp\php43B8.tmp
    [size] => 58
    [error] => 0
)

// Try 1
if ($stream = fopen($_FILES['video']['tmp_name'], 'r')) {

    echo stream_get_contents($stream, filesize($_FILES['video']['tmp_name']));
    fclose($stream);
}

// Try 2
if ($fp = fopen($_FILES['video']['tmp_name'], 'r')) {
    echo fread($fp, filesize($_FILES['video']['tmp_name']));
    fclose($fp);
}

// Try 3
file_get_contents($_FILES['video']['tmp_name'])

结果总是:blob:http://localhost/d53e40bd-686b-46c8-9e81-94789351466f

【问题讨论】:

  • 虽然通常与数据库查询相关,但您是否尝试过 fbsql_read_blob()? php.net/manual/en/function.fbsql-read-blob.php
  • 感谢您的回复!我只是跳过了那个,因为它是扩展名。此外,我不需要与数据库进行通信,因为 Blob 的内容应该通过其 API 发送到例如 YouTube。

标签: php blob


【解决方案1】:

我知道这是一个迟到的回复,你可能已经解决了这个问题,但这是我为我的 BLOB 处理所做的。由于 blob 已经上传到 TEMP 文件位置,我们首先使用 PHP 的 move_uploaded_file 函数将上传的文件移动到某处。从那里,您可以读取内容等,然后在处理完成后从服务器中删除文件。

这是一个使用图像文件的非常基本的示例:

// Ajax data for posting the blob, remember to set process data to false
formData.append('code', 'uploadedImage');
formData.append('image', blob);
var url = "script.upload.php";
$.ajax({
    type: 'POST',
    url: url,
    data: formData,
    processData: false,
    contentType: false,
    success: function (data) {}
});


// PHP Code for uploading the file to the server
if ($_POST['code'] == "uploadedImage") {
    $data = $_FILES['image']['tmp_name'];
    move_uploaded_file($data, $_SERVER['DOCUMENT_ROOT'] . "/img/" . time() . ".png");
}

我们现在在我们的基本目录/图像位置有一个类似1542839470.png 的文件。从这里,现在可以读取、移动、流式传输、存储图像,等等。我正在使用一个名为Croppie 的便捷插件来调整、旋转和裁剪我的图像,以及任何寻找简洁工具的人。通过首先处理它们,我可以避免之后必须对它们做任何事情。当您制作视频时,这不适用于您的特定情况,但对于做类似事情的人(比如我)来说,它是一个方便的插件。

完成文件后,通过 curl 到 YouTube API 或对已完成文件进行的任何处理,您可以使用以下命令简单地删除文件。从上面缓存视频或文件名和位置(通过设置位置$var 来简单地完成)并将其输入到此命令中。

unlink("path_to_file_location"); //delete it

【讨论】:

  • 感谢您的回答。我不久前决定使用其他方法,但您的方法看起来不错,谢谢!
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 2011-12-27
  • 2021-11-07
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 2019-12-11
相关资源
最近更新 更多