Я пытаюсь загрузить файл из базы данных, но мой файл всегда пуст. Мой выходной файл vardump, показанный ниже, указывает, что мои данные правильно загружены, но когда я использую заголовок для загрузки, я получаю html файл, имя которого совпадает с именем моего сценария загрузки вместо моего предполагаемого файла и его соответствующего имени. Пожалуйста, помогите мне указать на мою ошибку.
Это мой сценарий загрузки:
$Download = new Download();
$result = array(); //store results of output
$row = array();
try {
//execute retrieval of files from database
$Download-> showDBFiles();
//pass results to output array
$output = $Download->getMessages();
//var_dump($output);
//if id is set then get file from database
if (isset($_GET['id'])) {
$id = $_GET['id'];
//pump id into function getDBFiles to pull file with matching id
$Download->getDBFiles($id);
$row = $Download->getMessages();
$fileName = $row[0]['name'];
$fileType = $row[1]['type'];
$fileContent = $row[2]['content']; //content of file
$fileSize = $row[3]['size']; //file size
header('Content-Type:"' . $type . '"');
header('Content-length:"' . $size . '"');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
echo $content;
//var_dump($row);
exit;
}
} catch (Exception $e) {
$result[] = $e->getMessages();
}
Это, где функции называются:
protected $messages = array();
public function showDBFiles() {
global $database;
//$sql = "SELECT resume_id, resume_title FROM ".self::$table_name." ORDER BY resume_id";
$sql = "SELECT id, name FROM ".self::$table_name." ORDER BY id";
$result = $database->query($sql);
if(mysqli_num_rows($result)==0){
$this->messages[] = "Database is empty";
}else{
while(list($id, $name) = mysqli_fetch_array($result, MYSQLI_BOTH)){
$this->messages[] = array('id'=>$id, 'name'=>$name);
}
}
}
public function getDBFiles($id) {
global $database;
$sql = "SELECT * FROM ".self::$table_name." WHERE id = $id";
$result = $database->query($sql);
if ($row = $result->fetch_array(MYSQLI_ASSOC)) {
$name = $row['name'];
$type = $row['type'];
$content = $row['content']; //content of file
$size = $row['size']; //file size
$this->messages[] = array('name'=>$name, 'type'=>$type, 'content'=>$content, 'size'=>$size);
}
}
public function getMessages(){
return $this->messages;
}
Это мой вывод vardump:
array(1) { [0]=> array(4) { ["name"]=> string(14) "testing456.doc" ["type"]=> string(18) "application/msword" ["content"]=> string(86016) "...
Хорошо (после некоторого судебного форматирования.. Я знаю, что я тоже ненавижу wsywig.) Похоже, что вы строите стандартный многомерный массив
array(
array( 'name' => 'blah' )
)
И затем доступ к нему вот так
$row['name']
Когда вы действительно этого хотите
$row[0]['name']
Один ряд, а не многие.
Вы видите, что проблема связана с возвратом return $messages;
и set $this->messages[] = array('name'=>...
Также очевидно в вашем var_dump
как array(1) { [0]=> array(4){ ["name"]=>
если у вас были ошибки отображения, вы, вероятно, получите предупреждение undefined index, и этот вывод уничтожит ваши заголовки загрузки.
Тогда вы услышите Wont woont woont
со своего компьютера, но серьезно это очень простая ошибка, и иногда свежие пары глаз идут долгий путь.
ОБНОВИТЬ
Обратите внимание на то, как представлены данные массива
array(
[0]=> array(
["name"]=> "testing456.doc",
["type"]=> "application/msword",
)
)
Итак, вам нужен array[0]['name']
и array[0]['type']
. Но, как я упомянул в комментариях, лучше сделать это всего лишь на один ряд и ограничить его. Таким образом, он устраняет путаницу и все вместе. Можете ли вы иметь более одного ряда, это хороший вопрос.
Вы можете это ограничить
$sql = "SELECT id, name FROM ".self::$table_name." ORDER BY id LIMIT 1";
У вас сейчас всего 1
строка, но в будущем вы могли бы найти больше, чем с вашим запросом. Нет, если вы используете лимит.
И где вы сохраняете данные
$this->messages = array('name'=>$name, 'type'=>$type, 'content'=>$content, 'size'=>$size);
полностью удалите []
, это хорошо, только если у вас есть только один результат из базы данных. Затем имеет смысл изменить $this->messages
на $this->message
.
$row[1]
, его все $row[0]['name']
, $row[0]['type']
т. д., лучше изменить класс, чтобы хранить только одно сообщение, а затем использовать LIMIT 1 в вашем sql, не могли бы вы иметь более одного сообщения, который хороший вопрос, чтобы спросить себя