我的圖像列表中的數據庫表中有斑點。使用symfony中的斑點圖像的圖片庫
我想要做的是在listSuccess.php中顯示圖像,就像一個畫廊。
有人可以提供一些代碼,幫助或讓我開始?
Regards
我的圖像列表中的數據庫表中有斑點。使用symfony中的斑點圖像的圖片庫
我想要做的是在listSuccess.php中顯示圖像,就像一個畫廊。
有人可以提供一些代碼,幫助或讓我開始?
Regards
首先,如果你存儲在DB數據不將其存儲在一個事務所表。 這裏我舉的例子:
的schema.yml
File:
connection: doctrine
actAs: { Timestampable: ~ }
columns:
document_id: { type: integer(5), notnull: true}
name: string(255)
size: integer(11)
mime: string(255)
relations:
Document:
class: Document
local: document_id
foreign: id
type: one
onDelete: CASCADE
FileData:
local: id
foreign: file_id
type: one
foreignType: one
FileData:
connection: doctrine
columns:
file_id: { type: integer(6), notnull: true }
binary_data: { type: LONGBLOB, notnull: true }
relations:
File: { onDelete: CASCADE, local: file_id, foreign: id, foreignType: one }
前端/模塊/文件/動作/的actions.class.php
<?php
class fileActions extends sfActions
{
public function executeDownload(sfWebRequest $request)
{
$response = $this->getResponse();
/** @var $file File */
$file = $this->getRoute()->getObject();
$this->forward404Unless($file->getDocument()->isApprovedAndShared($this->getUser()));
$fsize = $file->getSize();
$response->setContentType($file->getMime());
$response->setHttpHeader('Content-Length',$fsize);
$response->setHttpHeader('Content-Disposition','filename='.$file->getName());
$response->setHttpHeader('Content-transfer-encoding','binary');
$response->setContent($file->getFileData()->getBinaryData());
return sfView::NONE;
}
public function executeAddFile(sfWebRequest $request)
{
$this->forward404Unless($request->isMethod(sfRequest::POST));
/** @var $document Document */
$document = $this->getRoute()->getObject();
$this->forward404Unless($document->getOffice()->getId() == $this->getUser()->getGuardUser()->getOfficeId(), $this->getContext()->getI18N()->__('textAccessForbidden'));
$form = new FileForm();
$files = $request->getFiles($form->getName());
$file_name = $files['file']['name'];
$file_already_exist = FileTable::getInstance()->getFile($document->getId(), $file_name);
if ($file_already_exist) {
$form = new FileForm($file_already_exist);
$form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
// $form->getObject()->setCreatedAt(date("Y-m-d H:i:s", time()));
$form->getObject()->setUpdatedAt(date("Y-m-d H:i:s", time()));
}
else {
$form = new FileForm();
$form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
}
if ($form->isValid())
{
$form->getObject()->setDocumentId($document->getId());
$file_result = $form->save();
if ($file_already_exist)
$this->getUser()->setFlash('notice', $this->getContext()->getI18N()->__("textFileReplacedOk", array('%s%'=>$file_result->getName())));
else
$this->getUser()->setFlash('notice', $this->getContext()->getI18N()->__("textFileUploadOk", array('%s%'=>$file_result->getName())));
$this->redirect($this->generateUrl("document_edit",$document));
}
$this->getUser()->setFlash('error', $this->getContext()->getI18N()->__("textFileUploadError"));
$this->forward("document","edit");
}
public function executeDelete(sfWebRequest $request)
{
/** @var $file File */
$file = $this->getRoute()->getObject();
$this->forward404Unless($request->getParameter('document_id') == $file->getDocumentId() , sprintf('The object doesn\'t belong to the document (file: %s).', $request->getParameter('id')));
$this->forward404Unless($file = FileTable::getInstance()->find(array($file->getId())), sprintf('Object file does not exist (%s).', $request->getParameter('id')));
$file->delete();
$this->getUser()->setFlash('notice', sprintf($this->getContext()->getI18N()->__("textFileDeletedOk"),$file->getName()));
$this->redirect($this->generateUrl("document_edit",DocumentTable::getInstance()->find(array($file->getDocumentId()))));
}
}
FileDataForm.class.php
class FileDataForm extends BaseFileDataForm
{
public function configure()
{
unset(
$this['file_id']
);
}
}
FileForm.class.php
class FileForm extends BaseFileForm
{
public function configure()
{
$this->disableCSRFProtection();
$this->useFields(array());
$this->widgetSchema['file'] = new sfWidgetFormInputFile(array());
$this->setValidator('file', new sfValidatorFile(array(
'max_size' => 1024*1024*sfConfig::get("app_max_file_size", 10) //MB
)));
}
public function save($con = null)
{
/** @var $validated_file
var_dump($validated_file) */
$validated_file = $this->getValue('file');
/** @var $file File */
$file = $this->getObject();
$file->setMime($validated_file->getType());
$file->setName($validated_file->getOriginalName());
$file->setSize($validated_file->getSize());
$fileData = new FileData();
$fd = @fopen($validated_file->getTempName(), 'rb');
$fileData->setBinaryData(fread($fd,$validated_file->getSize()));
fclose($fd);
$file->setFileData($fileData);
unset($this['file']); //do not save Validated file: this is a trick :)
return parent::save($con);
}
}
在您的列表操作中,獲取相應圖像對象的集合。在模板中,爲每個標籤生成一個<img>
標籤,指向另一個操作,它從數據庫中提取圖像本身,然後在設置適當的http標頭後輸出它。
您將圖像存儲在數據庫中的任何特定原因?將它們存儲在磁盤之外的某個地方會更有效率,因此您仍然可以訪問控制。
更新
一個基本的例子如下。我只是在這裏輸入它,所以可能包含錯誤。所有的
//actions.class.php
public function executeIndex(sfWebRequest $request) {
//get the images belonging to the current gallery
$this->images = Doctrine_Core::getTable("Image")->retrieveByGalleryId($request->getParameter("id"));
}
//indexSuccess.php
<?php foreach ($images as $image): ?>
<img src="<?php echo url_for("image_show", $image) ?>" alt="<?php echo $image->title ?>" />
<?php endforeach>
//actions.class.php again
public function executeShow(sfWebRequest $request) {
$image = $this->getRoute()->getObject();
$this->getResponse()->clearHttpHeaders();
$this->getResponse()->setContentType($image->mime_type);
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename=' . $image->file_name);
$this->getResponse()->setHttpHeader('Content-length', $image->file_size);
readfile($image->file_name);
return sfView::NONE;
}
$profile_picture = base64_encode(stream_get_contents($image->getContent()));
echo '<img src="data:image/jpeg;base64,'.$profile_picture.'" />';
請記住在圖像處理程序中發出正確的Content-type http標頭。此外,使用symfony的路由功能,使URL以.jpg或其他格式結尾,並嘗試獲得最後修改的標題,以幫助瀏覽器緩存,並防止不必要的重新加載。 – Nathan 2011-01-12 21:17:23