我正在尝试从数据库下载文件,但我的文件始终为空。下面显示的我的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) "...
答案 0 :(得分:0)
好的(经过一些司法格式化......我知道我也讨厌wsywig。)看起来你正在建立一个标准的多维数组
array(
array( 'name' => 'blah' )
)
然后像这样访问它
$row['name']
当你真的想要这个时
$row[0]['name']
一行,而不是很多。
您会看到问题看看您如何返回return $messages;
并设置为$this->messages[] = array('name'=>...
如果您出现显示错误,那么var_dump
array(1) { [0]=> array(4){ ["name"]=>
中的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
更改为$test = `svn cat ....`
header("Content-Disposition: attachment; filename=" . urlencode($filename));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
echo $test;
。