Сервер хранения изображений

Шаг 3. Отображение сохраненных изображений из базы данных

Чтобы вывести изображения, нужно создать два файла. Это файл fetch_image.php.

<?php header(«content-type:image/jpeg»); $host=’localhost’; $user=’root’; $pass=’ ‘; mysql_connect($host, $user, $pass); mysql_select_db(‘demo’); $name=$_GET; $select_image=»select * fromimage_tablewhereimagename=’$name'»; $var=mysql_query($select_image); if($row=mysql_fetch_array($var)) { $image_name=$row; $image_content=$row; } echo $image; ?>

Теперь мы хотим отобразить изображение — это делается с помощью файла display_image.php.

<html> <body> <formmethod=»GET»action=» «> <inputtype=»file»name=»your_imagename»> <inputtype=»submit»name=»display_image»value=»Display»> </form> </body> </html> <?php $getname= $_GET; echo»<img src = fetch_image.php?name=».$getname.» width=200 height=200 >»; ?>

Для загрузки изображения на сервер также потребуется три шага:

1. Создайте HTML-форму для загрузки изображения.
2. Сохраните путь к базе данных и изображение на сервере.
3. Выведите изображение.

>Шаг 1. Создайте HTML-форму

Вы можете использовать HTML-форму из предыдущего примера.

Как хранить детские рисунки и фотографии: 9 крутых идей для интерьера

Мы собрали для вас 20 простых, но в то же время отличных идей для детской комнаты, как хранить детские рисунки и фотографии.

Если ваш ребенок любит рисовать или фотографировать, то, наверняка, вы столкнулись с дилеммой, как хранить детские рисунки. Конечно, можно все их свалить в одну большую коробку, но вы тут же забудете о них, а ребенок будет чувствовать, что его и его труд не ценят. Ведь большинство детских рисунков посвящено родителям и нарисовано для них.

Можно превращать детские каляки-маляки в настоящие картины, делать ювелирные украшения по мотивам детских рисунков, мягкие игрушки, набить себе татуировку или сшить подушку по мотивам рисунка вашего ребенка, напечатать детские рисунки на чашках, тарелках или футболках, оцифровать их и поместить в цифровую фоторамку, заказать фотокнигу с ними или посвятить им аккаунт в инстаграме. Но есть и другие варианты. Сегодня мы поговорим, о том, как ипользовать рисунки ребенка в интерьере детской комнаты.

Детские рисунки довольно неудобно хранить в «исходнике». Ведь нарисованы они, как правило, на больших альбомных листах. Чтобы было проще, сфотографируйте рисунки и поделки вашего ребенка. Тогда дело придется иметь с фотографиями, которые могут быть удобного вам размера. Можно сделать коллаж из них и поместить в рамку или выделить целую стену.

Как прикрепить детские рисунки к стене? Используйте декоративный скотч. Он бывает различных расцветок, так что подолбрать узор, подходящий к интерьеру детской комнаты, не составит труда. Продаются декоративные скотчи в магазинах для творчества и в магазинах с канцтоварами.

Прищепки. Натяните карниз-струну или рейлинг вдоль стены (его можно купить в строительном магазине или в магазинах типа Икеа). Прикрепите прищепки к струне. В случае с рейлингом, понядобятся зажимы на нитях. С таким креплением можно будет менять экспозицию хоть два раза в день.

Если вы все еще не знаете, как хранить детские рисунки, наш совет: приклейте их. Конечно, фотографии с изображением шедевров вашего ребенка будут выглядеть на стене аккуратнее.

Хранить рисунки нужно не только малышам, но и детям постарше. Чтобы это сделать стильно, предложить подростку обустроить бизиборд в виде решетки в его рабочей зоне. Бизиборд можно купить готовым, а можно сделать самостоятельно из металлической сетки, купленой в строительном магазине.

Пробковая доска. Можно просто купить доску побольше, на которую ребенок сможет самостоятельно прикрепить свои рисунки. Или же оформить небольшие доски в виде рамок.

Если же вы решили, что будете хранить детские рисунки в оригинале, то вот несколько примеров, как это можно сделать красиво. Разместив рисунки в рамках, вы не только спрячере пятна от неудавчных попыток вашего ребенка сделать мир ярче. Но и покажете малышу, что его творчество ценно для вас, что вы им гордитесь и считаете его картины и аппликации достойными того, чтобы их все видели.

Если вы выберете именно этот вариант, то вам пригодится мастер-класс, как сделать рамки для картин из картона своими руками.

Зажимы для бумаги. Можно их приклеить в определенном порядке к стене клеевым пистолетом или прикрепить к обычной вешалке для одежды.

Еще один способ хранить детские рисунки на стене с возможностью их периодически менять. Открывающиеся рамки можно купить на Amazon.com ищем Child Artwork Frame от производителя Lil Davinci. Или как вариант прикрепить к рамкам струну, на которую вешаем зажимы или прищепки.

Итак, теперь у вас есть маса идей, как хранить детские рисунки. Какая же из них подойдет именно вам?

Источник заявочной фотографии exclusivelymum.com.au

ЧИТАЙ ТАКЖЕ: Что можно сделать из помпонов: 30 крутых идей

ЧИТАЙ ТАКЖЕ: Делаем картины из фотографий своими руками: яркие идеи для дома

ЧИТАЙ ТАКЖЕ: Лайфхаки для родителей: как навести порядок в комнате школьника

MySQL и хранение картинок в базе (mysql image binary php sql)

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Следующая >>

Ключевые слова: mysql, image, binary, php, sql, (найти похожие документы)
Date: Thu, 04 Jul 2002 16:44:53 +0600 From: Nickolay Kondrashov <niq@relinfo.ru> Newsgroups: fido7.su.dbms.sql Subject: MySQL и хранение картинок в базе > Прошу совета как быть по быстродействию обработки базы … > Суть: создаю галерею картинок .. связка php + mysql + apache .. > Т.е. надо хранить картинки! Я вот думаю где их лучьше хранить: в базе или на > диске как отдельное файло? Интересует вопрос по быстродействию … > > Т.Е. что будет быстрее обрабатываться: база в которой картинки храняться, или > база в которой хранятся ссылки на картинки (url тобишь ..)? > P.S. учитываю что картинок будет больше 300mb в jpg`ах … У этих двух подходов есть свои плюсы и минусы. Попробую их перечислить. Значит, хранение в БД. + Файлы проекта хранятся централизовано (что особенно хорошо при командной разработке). + Доступ к файлам в любом случае будет осуществляться через скрипт-загрузчик, что дает возможность более гибко контролировать этот процесс. — Доставка файла скриптом из БД будет с большей вероятностью проходить медленнее чем апачем из файловой системы. — В целом дамп БД будет слишком большим и, возможно, репликация будет требовать широких каналов между удаленными серверами. Также такой дамп будет трудно читаем по F3, т.к. бинарные данные будут смешаны с другими данными. Решается настройкой репликации и продумыванием структуры БД, т.е. нужно все бинарные данные засунуть в несколько таблиц (в твоем случае только не в одну). Сделай так чтобы, например, таблица MyBinariesXXX создавалась, когда в кол-во записей в таблице MyBinaries(XXX-1) превысило знчение YYY. Hапиши классик, который инкапсулировал бы доступ к этим разбросанным данным как к одной куче. Тогда MySQL будет шарить по этим таблицам почти также быстро как и апач по файловой системе и 300М ему будет не помеха. В этом же случае дамп БД будет легко читаем, т.к. бинарные данные расположены в специализированных таблицах. Хранение в файловой системе. + Высокая скорость доступа и меньшая нагрузка на сервер. Hекоторые товарищи, говорили, что выигрыш в скорости значителен, если количество файлов в папке не превышает порядка нескольких тысяч. Эту цифру, конечно, можно узнать получше, если реализовать схему подбную той, что описывалась выше, только не с таблицами а с папками. — Проблемы с целостностью данных, т.е. синхронизацией БД и файловой системы. Такие проблемы часто возникают если над проектом работает несколько разработчиков. Вывод: Оба подхода имеют право на существование при условии грамотной реализации доступа к данным и организации самих данных. Обычно я предпочитаю первый подход, т.к. объем данных и проигрыш в быстродействии незначительны. А указанные плюсы очень важны. Вот пример реализации универсального интерфейса доступа к бинарным данным. Используемые библиотеки: PHPlib для доступа к БД, PEAR для протоколирования. СУБД — MySQL. ______________________________ схема ______________________________ create table binaries ( id int(14) auto_increment not null, bin_data mediumblob, mime_type varchar(100), primary key (id) ); ______________________________ lib/binlib/BinariesIO.php — класс инкапсулирующий доступ к данным ______________________________ <?php class BinariesIO { var $mConfig; var $mDb; function BinariesIO(&$config, &$db) { $this->mConfig=&$config; $this->mDb=&$db; $GLOBALS->log(«bin_folder: «.$this->mConfig); $GLOBALS->log(«binscript_uri: «.$this->mConfig); if(!file_exists($this->mConfig)) { $GLOBALS->log(«bin_folder is not exist»); mkdir($this->mConfig,0777); } } function IsExists($id) { $GLOBALS->log(«IsExists(‘».$id.»‘)»); $sql=»SELECT id, mime_type FROM binaries WHERE id=’$id'»; $this->mDb->query($sql); return $this->mDb->next_record(); } function &GetBinaryObject($id) { $GLOBALS->log(«GetBinaryObject(‘».$id.»‘)»); $sql=»SELECT id, mime_type FROM binaries WHERE id=’$id'»; $this->mDb->query($sql); $bo=&new BinaryObject($this); if($this->mDb->next_record()) { $bo->mId=$this->mDb->f(«id»); $bo->mMimeType=$this->mDb->f(«mime_type»); } else { return null; } return $bo; } function &CreateBinaryObject() { $GLOBALS->log(«CreateBinaryObject()»); $sql=»INSERT INTO binaries (mime_type, bin_data) VALUES(NULL,NULL)»; $this->mDb->query($sql); $sql=»SELECT MAX(id) from binaries»; $this->mDb->query($sql); $this->mDb->next_record(); $bo=new BinaryObject($this); $bo->mId=$this->mDb->f(0); return $bo; } function &RemoveBinaryObject($id) { $bo=$this->GetBinaryObject($id); if($bo==null) return; $path=$bo->GetPath(); if($path!=null) if(file_exists($path)) unlink($path); $sql=»DELETE FROM binaries WHERE id=’$id'»; $this->mDb->query($sql); } function &GetBinaryObjectList() { $GLOBALS->log(«GetBinaryObjectsList()»); $sql=»SELECT id, mime_type FROM binaries»; $this->mDb->query($sql); for($i=0;$this->mDb->next_record();$i++) { $bo=&new BinaryObject($this); $bo->mId=$this->mDb->f(«id»); $bo->mMimeType=$this->mDb->f(«mime_type»); $boList=$bo; } return $boList; } } class BinaryObject { var $mId; var $mMimeType; var $mBio; function BinaryObject(&$bio) { $this->mBio=&$bio; } function GetAccessUrl() { return $this->mBio->mConfig.»?id=».$this->mId; } function GetPath() { return $this->mBio->mConfig.»/».$this->mId.».bin»; } function SetData(&$data) { $GLOBALS->log(«SetData(data)»); if($this->IsFile()) { $h=fopen($this->GetPath(), «w»); fwrite($h,&$data,strlen(&$data)); fclose($h); } else { $sql=»UPDATE binaries SET bin_data='».addslashes($data).»‘»; $this->mBio->mDb->query(&$sql); } } function &GetData() { $GLOBALS->log(«GetData()»); if($this->IsFile()) { $GLOBALS->log(«loading from ‘».$this->GetPath().»‘ size=».filesize($this->GetPath())); $h=fopen($this->GetPath(), «r»); $data=&fread($h,filesize($this->GetPath())); fclose($h); return ($data); } else { $GLOBALS->log(«loading from binaries db»); $sql=»SELECT bin_data FROM binaries WHERE bin_data IS NOT NULL AND id='».$this->mId.»‘»; $this->mBio->mDb->query($sql); if($this->mBio->mDb->next_record()) { return ($this->mBio->mDb->f(«bin_data»)); } else { return null; } } } function SetDataFromMultipartRequest($fieldName) { $GLOBALS->log(«SetDataFromMultipartRequest(‘».$fieldName.»‘)»); if($fieldName==»none») return; $h=fopen($fieldName,»r»); $data=&fread($h,filesize($fieldName)); fclose($h); if($this->IsFile()) { $h=fopen($this->GetPath(), «w»); fwrite($h,&$data,strlen(&$data)); fclose($h); } else { $sql=»UPDATE binaries SET bin_data='».addslashes($data).»‘ WHERE id='».$this->mId.»‘»; $this->mBio->mDb->query(&$sql); } } function GetMimeType() { $GLOBALS->log(«GetMimeType()»); $sql=»SELECT mime_type FROM binaries WHERE id='».$this->mId.»‘»; $this->mBio->mDb->query($sql); if($this->mBio->mDb->next_record()) { return stripslashes($this->mBio->mDb->f(«mime_type»)); } else { return null; } } function SetMimeType($mimeType) { $GLOBALS->log(«SetMimeType(‘$mimeType’)»); $sql=»UPDATE binaries SET mime_type='».addslashes($mimeType).»‘»; $this->mBio->mDb->query(&$sql); } function ToFile() { $GLOBALS->log(«ToFile()»); if($this->IsFile()) return; $data=&$this->GetData(); $h=fopen($this->GetPath(), «w»); fwrite($h,&$data,strlen(&$data)); fclose($h); $sql=»UPDATE binaries SET bin_data=NULL WHERE id='».$this->mId.»‘»; $this->mBio->mDb->query(&$sql); } function ToDb() { $GLOBALS->log(«ToDB()»); if(!$this->IsFile()) return; $data=&$this->GetData(); $sql=»UPDATE binaries SET bin_data='».addslashes($data).»‘ WHERE id='».$this->mId.»‘»; $this->mBio->mDb->query(&$sql); $path=$this->GetPath(); if($path!=null) if(file_exists($path)) unlink($path); } function IsFile() { $GLOBALS->log(«IsFile(«.($this->mBio->mConfig. «/».$this->mId.».bin»).»)=».file_exists($this->mBio->mConfig.»/».$this->mId.».bin»)); return file_exists($this->mBio->mConfig.»/».$this->mId.».bin»); } function IsDataPresent() { $GLOBALS->log(«IsDataPresent()»); if($this->IsFile()) { return filesize($this->mBio->mConfig.»/».$this->mId.».bin»)!=0; } else { $sql=»SELECT id FROM binaries WHERE bin_data IS NOT NULL AND id='».$this->mId.»‘»; $this->mBio->mDb->query($sql); return $this->mBio->mDb->next_record(); } } function GetSize() { $GLOBALS->log(«GetSize()»); if($this->IsDataPresent()) { if($this->IsFile()) { return filesize($this->mBio->mConfig.»/».$this->mId.».bin»); } else { $sql=»SELECT LENGTH(bin_data) FROM binaries WHERE id='».$this->mId.»‘»; $this->mBio->mDb->query($sql); $this->mBio->mDb->next_record(); return $this->mBio->mDb->f(0); } } return 0; } function ToString() { return «»; } } ?> ______________________________ lib/binlib/bin.php — выводит бинарный объект в стандартный вывод ______________________________ <?php require_once «../../init_pear.php»; require_once «binlib/BinariesIO.php»; include(«phplib/prepend.php3»); $bio_db=&new DB_Example; $bio=&new BinariesIO($BinariesIOConfig, $bio_db); $bo=$bio->GetBinaryObject($id); if($bo==null) { echo «no data present»; exit; } if($bo->GetMimeType()!=»») Header(«Content-type: «.$bo->GetMimeType()); echo ($bo->GetData()); ?> ______________________________ lib/binlib/testing/up_action.php — загрузка файла в систему ______________________________ <?php require_once «../../../init_pear.php»; require_once «binlib/BinariesIO.php»; include(«phplib/prepend.php3″); if($myfile!=»») { $GLOBALS->log(«file: ‘$myfile'»); $bio_db=&new DB_Example; $bio=&new BinariesIO($BinariesIOConfig, $bio_db); $bo=$bio->GetBinaryObject($id); if($bo==null) { $bo=$bio->CreateBinaryObject(); } $bo->SetDataFromMultipartRequest($myfile); $bo->SetMimeType($mime); } $d=»Location: up_view.php?id=».$bo->mId; header($d); exit; ?> ______________________________ lib/binlib/testing/up_convert.php — смена типа хранилища БД-файл/файл-БД ______________________________ <? require_once «../../../init_pear.php»; require_once «binlib/BinariesIO.php»; include(«phplib/prepend.php3»); $GLOBALS->log(«*** SCRIPT START ***»); $bio_db=&new DB_Example; $bio=&new BinariesIO($BinariesIOConfig, $bio_db); $bo=$bio->GetBinaryObject($id); if($bo->IsFile()) $bo->ToDb(); else $bo->ToFile(); $GLOBALS->log($bo->ToString()); $GLOBALS->log(«*** SCRIPT END ***»); header(«Location: up_view.php?id=$id»); exit; ?> ______________________________ lib/binlib/testing/up_delete.php — удаление бинарного объекта ______________________________ <? require_once «../../../init_pear.php»; require_once «binlib/BinariesIO.php»; include(«phplib/prepend.php3»); $GLOBALS->log(«*** SCRIPT START ***»); $bio_db=&new DB_Example; $bio=&new BinariesIO($BinariesIOConfig, $bio_db); $bo=$bio->RemoveBinaryObject($id); $GLOBALS->log(«*** SCRIPT END ***»); header(«Location: up_view.php»); exit; ?> ______________________________ lib/binlib/testing/up_view.php — управление списком бинарных объектов ______________________________ <?php require_once «../../../init_pear.php»; require_once «binlib/BinariesIO.php»; include(«phplib/prepend.php3″); $bio_db=&new DB_Example; $bio=&new BinariesIO($BinariesIOConfig, $bio_db); $bo=$bio->GetBinaryObject($id); if($bo==null) { $data=»no data present»; } else { $mime=$bo->GetMimeType(); if($bo->IsDataPresent()) { $data=&$bo->GetData(); } else { $data=»no data present»; } } ?> <?if($data!=»no data present»){?><img src=»<?=$BinariesIOConfig?>?id=<?=$id?>»><?}?> <form method=»POST» action=»up_action.php» enctype=»multipart/form-data»> <input type=»hidden» name=»id» value=»<?=$id?>»> <input type=»file» name=»myfile»><br> MIME Type: <input type=»text» name=»mime» value=»<?=$mime?>»><br> <input type=»submit» value=»Upload»> </form> <table border=»1″> <tr> <td>ID</td> <td>Type</td> <td>Size</td> <td>Store</td> <td>Convert</td> <td>Delete</td> </tr> <?php $boList=$bio->GetBinaryObjectList(); for($i=0,$s=sizeof($boList);$i<$s;$i++) { ?> <tr> <td><a href=»up_view.php?id=<?=$boList->mId?>»><?=$boList->mId?></a></td> <td><?=$boList->mMimeType==»»?»UNKNOWN»:$boList->mMimeType?></td> <td><?=$boList->GetSize()?></td> <td><?=$boList->IsFile()?»FILE»:»DB»?></td> <td><a href=»up_convert.php?id=<?=$boList->mId?>»><?=$boList->IsFile()?»TO DB»:»TO FILE»?></a></td> <td><a href=»up_delete.php?id=<?=$boList->mId?>»>delete</a></td> </tr> <? } ?> </table> <a href=»up_view.php»>add new</a> ______________________________ init_pear.php ______________________________ <? $DOCUMENT_ROOT=eregi_replace(«(.*)/$»,»\\1″,$DOCUMENT_ROOT); $include_path_old=@ini_get(«include_path»); if($DOCUMENT_ROOT==’/’) @ini_set(«include_path»,$include_path_old.»:».$DOCUMENT_ROOT.»/pear».»:».$DO CUMENT_ROOT.»:».$DOCUMENT_ROOT.»/lib»); else @ini_set(«include_path»,$include_path_old.»;».$DOCUMENT_ROOT.»/pear».»:».$DO CUMENT_ROOT.»:».$DOCUMENT_ROOT.»/lib»); require_once «log/MyLog.php»; // **GLOBAL*CONFIGURATION**************************************************** // $gAppLog=&new MyLog(); $gAppLog->setLogging(true); $gAppLog->setEcho(false); $BinariesIOConfig=$GLOBALS.»/binaries»; $BinariesIOConfig=»/lib/binlib/bin.php»; ?> ______________________________ log/MyLog.php — класс протокола ______________________________ <? require_once «Log.php»; require_once «Log/file.php»; class MyLog { var $mLog; var $mLogging; var $mEcho; function MyLog() { $this->mLog=new Log_file($GLOBALS.»/app.log»); $this->mLogging=true; $this->mEcho=false; } function setEcho($onTrueOffFalse) { $this->mEcho=$onTrueOffFalse; } function setLogging($onTrueOffFalse) { $this->mLogging=$onTrueOffFalse; } function log($message) { $this->debug($message); } function debug($message) { if($this->mLogging) $this->internalLog($message,»debug»); } function error($message) { if($this->mLogging) $this->internalLog($message,LOG_ERR); } function info($message) { if($this->mLogging) $this->internalLog($message,»info»); } function warning($message) { if($this->mLogging) $this->internalLog($message,LOG_INFO); } function fatal($message) { if($this->mLogging) $this->internalLog($message,LOG_CRIT); } function internalLog(&$message, $priority) { if($this->mEcho) echo «<b></b><br>\n»; $this->mLog->log(«.»] «.$message); } } ?>

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Следующая >>

Обсуждение
  • 1.1, nexel (?), 11:15, 12/07/2007
  • /–
    в многоюзерском режиме может вернуть лажу:
    $sql=»SELECT MAX(id) from binaries»;
    лучше так
    $sql=»SELECT LAST_INSERT_ID()»
  • 1.2, Papa (?), 10:55, 24/01/2008
  • /–
    Около пяти лет профессионально занимаюсь созданием подобных вещей. Имхо, автор абсолютно не интересовался данным вопросом, хотя бы так как это реализовано в больших коммерческих проектах.
  • 2.4, alexzh (??), 16:09, 02/02/2008
  • /–
    Подскажи как реализовано в больших комерческих проектах. Очень интересная тема и будет полезна многим. Очень хочется увидеть как делают професионалы, дабы было с чем сравнивать.
  • 1.3, latteo.org.ua (?), 00:12, 30/01/2008
  • +1 /–
    Может кому не жалко для новичка, самый элиментарный пхп скрипт который «засунет» картинку в MySQL
  • 1.5, Guest (??), 18:03, 16/04/2008
  • /–
    Imxo метод 1 в крупных проекта будет нагружать БД. Лучше 2-ой метод. Картинки — не настолько важная информация, чтобы контролировать жестко доступ. Думаю, в полне можно обойтись одной папкой с общим доступом на чтение.
  • 1.6, Сергей (??), 18:50, 23/12/2008
  • /–
    столкнулся с проблемой, в таблице 50000 картинок общим объемом 300MB, select count(*) from image; выполняется 30 сек, это нормально или у меня что-то не так с MySQL?
  • 2.7, error500 (??), 18:53, 07/04/2009
  • /–
    у тебя что то не так с головой
    И вообще хранение бинарников в базе (таких как картинки) для веб проектов может придумать только человек срочно нуждающийся в медицинской помощи.
  • 1.8, Веб (?), 01:13, 24/03/2010
  • /–
    Сам ты больной на голову что схочу то и напишу.
  • 2.11, Аркадий (??), 11:32, 13/08/2011
  • /–
    А Вы, случайно, не в мелокомягких работаете? А то что-то мне подсказывает, что они руководствуются тем же принципом.
  • 1.9, leon (??), 17:54, 21/11/2010
  • /–
    // select count(*) from image
    так делай count по индексному полю
    иначе , естетстенно будет строки пересчитывать
  • 1.10, АзатотазА (?), 20:44, 04/02/2011
  • /–
    В up_view.php две части верно? или вторая часть это отдельный файл?

    Ваш комментарий

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *