在PHP Mysql中下载完整大小的文件

我在使用php从MYSQL下载 Blob文件</ strong>时遇到问题。</ p>

下载文件中的 php脚本</ strong>:

  $ querysel =“select * from file file_id ='$  fileid'“; 
$ resultsel = mysql_query($ querysel);
$ rowsel = mysql_fetch_array($ resultsel);

$ filename = $ rowsel ['file_name'];
$ mimetype = $ rowsel [' mime_type'];
$ filesize = $ rowsel ['file_size'];

header(“Content-length:”。$ filesize);
header(“Content-type:”。$ mimetype); \ n header(“Content-disposition:attachment; filename =”。$ filename);
header(“Content-Description:PHP Generated Data”);
header(“Content-transfer-encoding:binary”);
echo $ filename;
</ code> </ pre>

此表格在 mysql </ strong>中: </ p>

问题</ strong> [已更新] </ p>


    < li>

    这里的问题似乎是在下载文件后,该特定文件的文件大小与mysql中保存的文件大小不匹配。 我不知道为什么?</ p> </ li>

  1. 我也遇到了这个小问题,我下载了Powerpoint并将其删除并再次下载后会自动保存到下载中 自动打开。 这是正常的吗?</ p> </ li>
    </ ol>

    示例:</ p>

    文件大小为6.8MB的BLOB文件应该是 也可以下载6.8MB,但这里发生的是下载文件的文件大小只有 25bytes </ strong>。 为什么?</ p>

    非常感谢任何帮助。 谢谢</ p>
    </ div>

展开原文

原文

I have a problem downloading the Blob file from MYSQL using php.

Here is my php script in downloading file:

        $querysel = "Select * from file where file_id = '$fileid'";
        $resultsel = mysql_query($querysel);
        $rowsel = mysql_fetch_array($resultsel);

        $filename = $rowsel['file_name'];
        $mimetype = $rowsel['mime_type'];
        $filesize = $rowsel['file_size'];

        header("Content-length: ".$filesize);
        header("Content-type: ".$mimetype);
        header("Content-disposition: attachment; filename=".$filename);
        header("Content-Description: PHP Generated Data");
        header("Content-transfer-encoding: binary");
        echo $filename;

And this table in mysql:enter image description here

PROBLEM   [UPDATED]

  1. What seems to be the problem here is that after downloading the file, the file size from that particular file don't match with the file size saved in mysql. I don't know why?

  2. I also encounter this small problem, After I downloaded the Powerpoint and delete it and download it again would be automatically saved to downloads and will automatically be opened. Is that normal?

Example:

The BLOB file with 6.8MB of file size was supposed to be downloaded with 6.8MB also but what happened here is that the file size of the downloaded file is only 25bytes. Why?

Any help would be much appreciated. Thanks

duan02468
duan02468 是的,这就是我实际做的。大小检查就是这个词:)
大约 5 年之前 回复
douge3113
douge3113 很公平。好吧..见下面的里格斯回答。@Makudex
大约 5 年之前 回复
dtrpv60860
dtrpv60860 我没有遇到存储blob的问题,实际上我使用了MEDIUMBLOB来存储高达16MB的文件,我在代码中实际做的是陷阱,如果文件大于10MB,那么我就不会存储在数据库中。MEDIUMBLOB不是BLOB。如果您可以在我的数据库表上看到我能够存储该文件。
大约 5 年之前 回复
dqc3469
dqc3469 你没看到我在这说的话......?我没有写“BLOB可能不够大,无法存储这么大的文件。”-我写道“BLOB不够大,不足以存储这么大的文件。”“不是”,如“不是”。
大约 5 年之前 回复
douqiao6563
douqiao6563 引自stackoverflow.com/questions/5775571/的答案。“BLOB最大可以是65535字节。如果您需要更多考虑使用MEDIUMBLOB用于16777215字节或LONGBLOB用于4294967295字节。有关详细信息,请参阅字符串类型的存储要求“。
大约 5 年之前 回复
doushang8512
doushang8512 注入漏洞:检查。使用不推荐的扩展名:check。请停止使用mysql,不推荐使用它。切换到PDO或mysqli,并学习使用预准备语句
大约 5 年之前 回复
duanjing9739
duanjing9739 我更新了这个问题。请看看。真的需要帮助。并感谢您的评论。
大约 5 年之前 回复
duan19750503
duan19750503 将文件内容写入响应的代码在哪里?您发布了仅写入标题的代码。如果这是你的整个代码,那就是问题所在。在标头之后,您需要将文件的内容作为字节数组写入响应。
大约 5 年之前 回复
douza6300
douza6300 BLOB不够大,无法存储这么大的文件。6.8MiBdev.mysql.com/doc/refman/5.0/en/blob.html
大约 5 年之前 回复
donglong7338
donglong7338 还有一个原因是不将文件放入数据库
大约 5 年之前 回复
duanhuo0577
duanhuo0577 附:通常建议您将文件上传到文件系统,而不是数据库。您可以在db中存储文件名,路径和元数据,但通常不建议将文件存储在db中。
大约 5 年之前 回复
douchuntang2827
douchuntang2827 最后一行:echo$filename不发送内容但只发送文件名(可能长25个字节?)
大约 5 年之前 回复
dsm1998
dsm1998 你正在做echo$filename;。您所做的只是制作一个带有字符串“01LCDSlides1.pps”的文本文件。
大约 5 年之前 回复
dongtieshang5429
dongtieshang5429 我想你会发现“01LCDSlides1.pps”约有25个字符。也许你想要返回文件,而不是文件名?
大约 5 年之前 回复
duanmen8491
duanmen8491 在file_content列上使用unserialize:php.net/manual/fr/function.unserialize.php并检查文件大小后
大约 5 年之前 回复
douwen7475
douwen7475 你为什么不尝试这个?2my4edge.com/2013/07/...
大约 5 年之前 回复

1个回答

It seems to me you want to be echoing the file contents and not its filename

    $querysel = "Select * from file where file_id = '$fileid'";
    $resultsel = mysql_query($querysel);
    $rowsel = mysql_fetch_array($resultsel);

    $filename = $rowsel['file_name'];
    $mimetype = $rowsel['mime_type'];
    $filesize = $rowsel['file_size'];

    header("Content-length: ".$filesize);
    header("Content-type: ".$mimetype);
    header("Content-disposition: attachment; filename=".$filename);
    header("Content-Description: PHP Generated Data");
    header("Content-transfer-encoding: binary");

    echo $rowsel['file_content'];          //<-- changed line

Of course you still probably have a problem with the larger files in that a BLOB is not large enough to hold 6.8 Meg. See @Fred-ii- comment for details and links to all the relevant info you need to check that.

Even a LONGBLOB is only 4,294,967,295 bytes, thats a little over 4Gig, so you probably need to do some size checking before storing to even a LONGBLOB.

The safest suggestion would be to store the actual files on disk and only the filename and path in the database.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐