cakephp: 文件上传
来源:互联网 发布:js给div添加边框 编辑:程序博客网 时间:2024/06/06 08:47
原文: http://cakebaker.42dh.com/2006/04/15/file-upload-with-cakephp/
文章中代码经过测试: 需要代码请联系
这篇文章我将讲述如何上传以及在数据库中存储文件,是的,我说的是在数据库中存储文件.由于数据库性能的
原因不推荐在数据库中保存文件.当然这是在设计应用程序是考虑的重点.
为什么要把文件存储在数据库中有下面几个原因:
1. 所有文件存储在一个地方: 数据库
2. 易于测试
3. 易于开发,因为我不必维护数据库和文件系统的同步问题
收先定义MYSQL数据库表的结构
非常容易,是吗? 现在我将在数据库中存储文件.为了检索文件,我需要一个download()方法,把它添加到控制器中:
显示文件列表控制器方法:
/**
* 文件下载
*
* @param integer $id 文件id
*
* Usage: uploads/download/1
*/
function download($id) {
// 通过文件Id查询文件的数据
$file = $this->Upload->findById($id);
header('Content-type: ' . $file['Upload']['type']); // MIME类型
header('Content-length: ' . $file['Upload']['size']); // 文件长度(字节)
header('Content-Disposition: attachment; filename=' . $file['Upload']['name']); // 提示用户保存文件
echo $file['Upload']['data'];
exit ();
}
* 文件下载
*
* @param integer $id 文件id
*
* Usage: uploads/download/1
*/
function download($id) {
// 通过文件Id查询文件的数据
$file = $this->Upload->findById($id);
header('Content-type: ' . $file['Upload']['type']); // MIME类型
header('Content-length: ' . $file['Upload']['size']); // 文件长度(字节)
header('Content-Disposition: attachment; filename=' . $file['Upload']['name']); // 提示用户保存文件
echo $file['Upload']['data'];
exit ();
}
// app/views/uploads/filelist.ctp
<table>
<?php
echo $html->tableHeaders(array_keys($filelist[0]['Upload']));
foreach ($filelist as $file){
echo $html->tableCells($file['Upload'], array('bgcolor' => 'green','style'=>'color:white;'));
}
?>
</table>
<table>
<?php
echo $html->tableHeaders(array_keys($filelist[0]['Upload']));
foreach ($filelist as $file){
echo $html->tableCells($file['Upload'], array('bgcolor' => 'green','style'=>'color:white;'));
}
?>
</table>
/**
* 显示文件列表
*
* Usage: uplodas/filelist
*/
function filelist() {
$this->set('filelist', $this->Upload->findAll(null, array (
'id',
'name',
'type',
'size',
'created',
'updated','modified'
), 'id DESC'));
}
* 显示文件列表
*
* Usage: uplodas/filelist
*/
function filelist() {
$this->set('filelist', $this->Upload->findAll(null, array (
'id',
'name',
'type',
'size',
'created',
'updated','modified'
), 'id DESC'));
}
CREATE TABLE uploads (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(75) NOT NULL,
type VARCHAR(255) NOT NULL,
size INT(11) NOT NULL,
data MEDIUMBLOB NOT NULL,
created DATETIME,
updated DATETIME,
modified DATETIME,
PRIMARY KEY (id)
);
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(75) NOT NULL,
type VARCHAR(255) NOT NULL,
size INT(11) NOT NULL,
data MEDIUMBLOB NOT NULL,
created DATETIME,
updated DATETIME,
modified DATETIME,
PRIMARY KEY (id)
);
注意: 除非你明确的知道上传的文件不会超过64K大小,否则应该使用MEDIUMBLOG或则LONGBLOB数据库类型.
模型是很直观的:
// app/models/uploads.php
class Upload extends AppModel
{
public $name = 'Upload';
}
class Upload extends AppModel
{
public $name = 'Upload';
}
目前我省略了控制器的创建而直接创建视图
// app/views/uploads/add.ctp
<form action="/uploads/add" enctype="multipart/form-data" method="post">
<?php echo $form->file('uploads/File'); ?>
<?php echo $html->submit('Upload')); ?>
</form>
<form action="/uploads/add" enctype="multipart/form-data" method="post">
<?php echo $form->file('uploads/File'); ?>
<?php echo $html->submit('Upload')); ?>
</form>
现在我准备创建控制器并实现add方法
// app/controllers/files_controller.php
class UploadsController extends AppController{
/**
* 上传文件
*
* Usage: uploads/add
*/
function add() {
if (!empty ($this->data['uploads']['File']) && is_uploaded_file($this->data['uploads']['File']['tmp_name'])) {
// 把文件存入变量
$this->data['uploads']['File']['data'] = fread(fopen($this->data['uploads']['File']['tmp_name'], "r"), $this->data['uploads']['File']['size']);
// 同步数据库
$this->Upload->save($this->data['uploads']['File']);
}
// debug
var_dump($this->data['uploads']['File']);
}
}
class UploadsController extends AppController{
/**
* 上传文件
*
* Usage: uploads/add
*/
function add() {
if (!empty ($this->data['uploads']['File']) && is_uploaded_file($this->data['uploads']['File']['tmp_name'])) {
// 把文件存入变量
$this->data['uploads']['File']['data'] = fread(fopen($this->data['uploads']['File']['tmp_name'], "r"), $this->data['uploads']['File']['size']);
// 同步数据库
$this->Upload->save($this->data['uploads']['File']);
}
// debug
var_dump($this->data['uploads']['File']);
}
}
- cakephp: 文件上传
- cakephp 文件上传
- cakephp 文件下载
- CakePHP文件下载
- cakephp中使用ckeditor+ckfinder实现在线编辑与文件上传.
- cakephp
- CakePHP
- cakephp
- cakephp
- CakePHP
- CakePHP
- CakePHP
- CakePHP
- CakePHP: SimpleTest找不到arguments.php文件
- 改写Cakephp Plugin里面的模板文件
- Linux中执行CakePHP Shell文件
- 在CakePHP中实现文件下载
- 实现头像上传及剪切功能(cakephp+jquery)
- [转载]ELF文件格式(三)
- PictureStudio开发笔记02-多国语言界面的实现
- 使用hibernate实现树形结构无限级分类
- _beginthread( ) 和_beginthreadex( )
- 在MyEclipse快速搭建Hibernate应用
- cakephp: 文件上传
- Spring XML配置十二个最佳实践
- 页面打印自定义设置
- 《Java参考大全》之一
- HTC编程思想
- 3D玩法最优算法
- 读研应该做的-----by 北飞的蜗牛(清华)
- Tomcat启动大剖析
- 回忆---我的大学(三) by 吉林大学软件专业 王跃伟