【问题标题】:How to save encoded Base64 strings from database, to files, on disk?如何将编码的 Base64 字符串从数据库保存到磁盘上的文件?
【发布时间】:2015-08-27 02:22:43
【问题描述】:

第一次发帖:

我有一个 MySQL 数据库,它是由这个命令创建的:

CREATE TABLE IF NOT EXISTSCKox(aTEXT NOT NULL,bTEXT NOT NULL );

下面是它的结构:

+----------+-----------------+
|    id    |   base64_str    |
+----------+-----------------+
|  file_1  |  base64_str_1   |
|  file_2  |  base64_str_2   |
|  file_3  |  base64_str_3   |
|  file_4  |  base64_str_4   |
+----------+-----------------+

为了将这些 Base64 字符串(在数据库中)保存到文件中(在我的 web 服务器 上),我运行了以下 PHP 代码:

<?php

    // database connection
    // ...

    $cmd = mysql_query("SELECT * FROM `MyTable`");
    while($data = mysql_fetch_array($cmd)) {

    $filename = $data[id];
    $filedata = $data[base64_str];

    header('Content-Description: File Transfer');
    header("Content-type: application/octet-stream");
    header("Content-disposition: attachment; filename= ".$filename."");

    echo base64_decode($filedata);

    }

    // ...

?>

它返回只有一个文件,并且这个保存的文件中没有没有数据。但是,我想将这些 Base64 字符串保存到 服务器磁盘上的文件中。


在得到人们的帮助后(在 StackOverlow 上),我更新了我的代码,它已满:

// database connection
// ...

$cmd = mysql_query("SELECT * FROM `MyTable`");

while ($data = mysql_fetch_array($cmd)) {

file_put_contents($data['id'], base64_decode($data['base64_str']));
echo $data['base64_str'];

}

// ...

但是,我仍然只获得一个文件。主要问题是什么?如何解决?

【问题讨论】:

  • $data["id"] 和 $data["base64_str"] 将列名放在双引号内
  • 您只能下载一个文件
  • 再想想 fpj 你在循环中传递标头值
  • 如果可以的话,你应该stop using mysql_* functions。它们不再被维护并且是officially deprecated。改为了解 prepared statements,并考虑使用 PDO,it's really not hard
  • 在任何情况下,HTTP 响应都可以包含单个标头和单个内容,因此您一次只能发送一个文件

标签: php mysql base64


【解决方案1】:

对于从数据库转储文件到磁盘使用file_put_contents

$cmd = mysql_query("SELECT * FROM `MyTable`");

while ($data = mysql_fetch_array($cmd)) {
    file_put_contents($data['id'], base64_decode($data['base64_str']));
}

【讨论】:

  • 我的代码将所有文件转储到服务器磁盘。您只能下载一个文件。这是http限制。你想下载所有文件,你必须先将它们压缩成存档文件。
【解决方案2】:

您暂时无法执行该文件发送逻辑,因为您正在将多个文件的内容发送回客户端,并且它会将所有文件一个接一个地附加到客户端的一个文件中。

您可以获取所有文件,在服务器中创建临时文件,将它们压缩成 tgz、zip 文件或其他文件,然后将其发送回用户,或者您只能发送一个文件。

这也是错误的:

$filename = $data[id];
$filedata = $data[base64_str];

您需要引号(单引号或双引号):

$filename = $data["id"];
$filedata = $data["base64_str"];

【讨论】:

  • @fpj 使用 fopen 不会改变任何东西。你的逻辑是行不通的。您不能将多个文件发送给一个用户,除非您将它们压缩为一个。
  • @fpj 首先,不要不断更改您的文本或 cmets,否则其他人的答案将失去意义。使用 fopen 或 fwrite 不会神奇地解决您的问题。您一次只能通过浏览器向用户发送一个文件。
  • @fpj 我不知道我或您问题的其他评论者是否在说另一种语言,所以我会再试一次,使用我之前的评论:您只能通过以下方式向用户发送一个文件浏览器。
  • @fpj 似乎您想要服务器端文件处理,这可以完成。由于您之前从未提到过,因此很难猜测...
猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2015-08-13
  • 2010-11-29
  • 2014-10-04
  • 2021-05-09
相关资源
最近更新 更多