У меня есть таблица MySQL с столбцом LONGBLOB для сохранения файла (хотя я знаю, что сохранение файлов непосредственно в базе данных не является хорошей практикой.) Сохранение работает отлично! (C: \ ProgramData \ MySQL \ MySQL Server 5.7 \ Data \ dogsport) размер dogport увеличился до нового сохраненного файла.
Я написал часть сценария загрузки. Загрузка файлов на компьютер (не отображение изображения на веб-странице).
Проблема: Загруженный файл показывает только 4 байта, хотя он должен быть 4.83 МБ. Когда я открываю изображение, изображение также не отображается (см. Снимок экрана)
Какова причина?
Обновленный код для @Andrew:
$query = "SELECT Id,Name,Type,SizeMB FROM Upload"; // Good practice. Do not process much data here. leave Content field $result = mysqli_query ( $con, $query) or die ("Couldn't execute SELECT query: ". mysqli_error($con)); $nrows = mysqli_num_rows($result); echo '<table> <tr> <td>Id</td> <td>Name</td> <td>Type</td> <td>Size (MB)</td> </tr>'; $selfpg = $_SERVER['PHP_SELF']; while( $row = mysqli_fetch_assoc($result) ){ extract($row); echo "<tr> <td>$Id</td> <td>$Name</td> <td>$Type</td> <td>$SizeMB</td> <td> <a href='$selfpg?id=$Id'> Download </a> </td> </tr>"; } echo '</table>'; //---------------------------------------------------------------------- if ( isset($_GET['id']) ){ $result_id = "SELECT Content FROM Upload WHERE Id=". $_GET['id']; $row = mysqli_fetch_assoc($result_id); extract($row); $size_bytes = $SizeMB * 1024 * 1024; header("Content-Type: ". $Type); header("Content-Length: ". $size_bytes); header("Content-Disposition: attachment; filename= ". $Name); echo $Content; } else{ echo "<br>No id received to download a file</br>"; }
Еще есть проблема
ОБНОВИТЬ !!! – Загрузите мой код с помощью SQL
http://s000.tinyupload.com/index.php?file_id=88155436688298142745
Ваша проблема может быть вызвана этим
header("Content-Length: ". $SizeMB);
Заголовок Content-Length
должен содержать размер в байтах, а не мегабайт.
Кроме того, SELECT * FROM Upload
– это плохая практика. Ваш запрос вернет все поля из таблицы, включая longblob
. Вам не нужно обрабатывать так много данных. В скрипте вы используете только Id
, Name
, Type
и SizeMB
, поэтому выбирайте только те поля. И вместо
mysqli_data_seek($result,0);
вы можете выполнить второй запрос:
SELECT Content FROM Upload WHERE Id = $Id