图像库使用symfony中的blob图像

时间:2011-01-12 15:04:11

标签: image-processing symfony1 blob

我的数据库表中有一个图像列表作为blob。

我想要做的是在listSuccess.php中显示图像,就像一个图库。

有人可以提供一些可以帮助或让我入门的代码吗?

此致

3 个答案:

答案 0 :(得分:2)

首先,如果您在DB中存储数据,请不要将其存储在一个sigle表中。 这是我的例子:

的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);
  }
}

答案 1 :(得分:1)

在列表操作中,获取相应图像对象的集合。在模板中,为每个操作生成<img>标记,指向另一个操作,从数据库中提取图像,然后在设置相应的http标头后输出。

您将图像存储在数据库中的任何特定原因?将它们存储在磁盘上,在webroot之外的某个位置更高效,因此您仍然可以访问控制。

<强>更新

以下是一个基本的例子。我只是在这里输入,所以可能包含错误。

//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;
}

答案 2 :(得分:1)

$profile_picture = base64_encode(stream_get_contents($image->getContent()));
echo '<img src="data:image/jpeg;base64,'.$profile_picture.'" />';