PHP를 사용하여 MySQL 데이터베이스에서 이미지를 저장 및 검색하려면 어떻게 해야 합니까?
MySQL에 이미지를 삽입하고 PHP를 사용하여 이미지를 가져오려면 어떻게 해야 합니까?
어느 쪽이든 경험이 한정되어 있기 때문에 작은 코드를 사용하여 이 문제를 해결할 수 있습니다.
먼저 다음과 같은 이미지를 저장할 MySQL 테이블을 만듭니다.
create table testblob (
image_id tinyint(3) not null default '0',
image_type varchar(25) not null default '',
image blob not null,
image_size varchar(25) not null default '',
image_ctgy varchar(25) not null default '',
image_name varchar(50) not null default ''
);
그런 다음 다음과 같은 이미지를 데이터베이스에 쓸 수 있습니다.
/***
* All of the below MySQL_ commands can be easily
* translated to MySQLi_ with the additions as commented
***/
$imgData = file_get_contents($filename);
$size = getimagesize($filename);
mysql_connect("localhost", "$username", "$password");
mysql_select_db ("$dbname");
// mysqli
// $link = mysqli_connect("localhost", $username, $password,$dbname);
$sql = sprintf("INSERT INTO testblob
(image_type, image, image_size, image_name)
VALUES
('%s', '%s', '%d', '%s')",
/***
* For all mysqli_ functions below, the syntax is:
* mysqli_whartever($link, $functionContents);
***/
mysql_real_escape_string($size['mime']),
mysql_real_escape_string($imgData),
$size[3],
mysql_real_escape_string($_FILES['userfile']['name'])
);
mysql_query($sql);
데이터베이스의 이미지를 웹 페이지에 표시할 수 있습니다.
$link = mysql_connect("localhost", "username", "password");
mysql_select_db("testblob");
$sql = "SELECT image FROM testblob WHERE image_id=0";
$result = mysql_query("$sql");
header("Content-type: image/jpeg");
echo mysql_result($result, 0);
mysql_close($link);
이미지를 데이터베이스에 저장하는 대신 디스크에 있는 폴더에 저장하고 위치를 데이터베이스에 저장합니다.
일반적으로 DB에서 이미지를 제공하는 것은 디스크에서 이미지를 제공하는 것보다 훨씬 느립니다.
PHP 프로세스를 시작하여 DB 연결을 열고 DB가 파일 시스템과 동일한 디스크 및 RAM에서 이미지 데이터를 읽고 몇 개의 소켓 및 버퍼를 통해 전송한 다음 PHP를 통해 푸시하면 기본적으로 캐시할 수 없으며 청크 HTTP 인코딩의 오버헤드가 추가됩니다.
최신 OTOH 웹 서버는 최적화된 커널 호출(메모리 매핑 파일 및 TCP 스택에 전달된 메모리 영역)을 거의 사용하지 않고 이미지를 처리할 수 있습니다.
이것은, 1대의 머신으로 20매 또는 2000매의 화상을 병렬로 처리할 수 있는 것의 차이입니다.
따라서 트랜잭션 무결성이 절대적으로 필요하거나(실제로 DB 및 파일 시스템 정리 루틴의 이미지 메타데이터만으로 수행 가능), 이미지에 적합하도록 PHP의 HTTP 처리를 개선하는 방법을 알고 있지 않는 한 실행하지 마십시오.
제 의견은 이미지를 데이터베이스에 직접 저장하는 것이 아니라 이미지 위치를 데이터베이스에 저장하는 것이 좋습니다.두 옵션을 비교하기 때문에 데이터베이스에 이미지를 저장하는 것이 보안상 안전합니다.단점은 다음과 같습니다.
데이터베이스가 파손되어 있는 경우는, 취득할 방법이 없습니다.
다른 옵션에 비해 DB에서 이미지 파일 검색 속도가 느립니다.
한편, 이미지 파일 위치를 db에 저장하면 다음과 같은 장점이 있습니다.
그것은 쉽게 회수할 수 있다.
여러 이미지가 저장되어 있으면 이미지 정보를 쉽게 검색할 수 있습니다.
또한 DB가 아닌 파일 시스템에 이미지를 저장하는 방법을 선택할 것을 권장합니다.여기를 참조해 주세요.이미지 DB에 저장 - 예?아니오?
개인적으로는 이미지를 데이터베이스에 저장하지 않고 외부에서 접근할 수 없는 폴더에 저장하고 데이터베이스를 사용하여 위치를 추적합니다.데이터베이스 크기를 낮게 유지하며 PHP를 사용하여 포함할 수 있습니다.PHP 없이는 그 이미지에 액세스할 수 없습니다.
이미지를 데이터베이스에 저장하는 대신 전화기와 PC에 저장하고 데이터베이스 저장에 필요한 경로를 사용합니다.
@Andomar의 기본 개념에는 동의하지만 SQL에 대용량 데이터가 저장되지 않도록 실제 이미지를 디스크에 저장합니다.SQL에서 큰 필드는 255자입니다.따라서 이미지 파일을 Blobs에 저장해야 합니다. Blobs는 행 수가 적은 경우(수백만 개가 아니라 수백 개라고 생각됨) 잘 작동합니다.추론은 복잡하지만 좋은 실천이다.아는 방법은 다음과 같습니다.
나는 많은 이미지를 저장하는 큰 프로젝트를 썼다.SQL의 두통을 피하기 위해 항상 디스크에 저장하십시오.DB가 손상되어 데이터베이스에 "재구축"할 수 없는 이미지를 남길 우려가 있는 경우 SQL 테이블을 백업하는 것 외에 간단한 수정이 있습니다.
이미지를 디렉토리 트리에 저장하여 사용자 및 해석에 적합한 디렉토리 이름을 사용합니다.따라서 시간별로 저장하면 "/year/month/day/picture.jpg" 또는 사용자 "/user_id/picture.jpg"처럼 보일 수 있습니다.이를 개념으로 사용하여 경로를 SQL에 저장합니다.이렇게 하면 SQL 테이블이 작고 캐시 가능한 경우가 많아지며 SQL 테이블을 한 서버에 두고 이미지를 AWS의 S3와 같은 다른 "서버"에 저장할 수 있습니다.
편집증이 심한 경우 이미지 자체와 동일한 디렉토리에 "{image_name)_meta.json"이라는 파일을 저장할 수 있습니다.일반적으로 DB 테이블에 저장하는 이미지에 대한 메타 데이터로 데이터를 채웁니다.테이블이 파손된 경우 트리를 통과하여 JSON 파일에서 테이블을 재구축하는 작은 함수를 작성할 수 있습니다.물론 더 많은 디스크 공간을 차지하지만 상당히 저렴합니다(생각:AWS의 S3).
이 문제를 해결하는 방법은 여러 가지가 있지만 SQL 유형의 테이블에 대량의 이미지를 저장하는 것은 좋은 방법이 아닙니다.예외적으로 한 번에 수백 개를 표시하거나 (1초 미만이 아니라) 빠른 검색 시간을 표시하는 경우가 있습니다.
당신의 프로젝트에 행운을 빌어요!
언급URL : https://stackoverflow.com/questions/1636877/how-can-i-store-and-retrieve-images-from-a-mysql-database-using-php
'source' 카테고리의 다른 글
"집약 함수는 WHERE에서 허용되지 않습니다" 오류를 방지하는 방법 (0) | 2023.01.22 |
---|---|
순서부여된 기본 dict를 구현하는 방법 (0) | 2023.01.22 |
MariaDB : 데이터베이스를 만들고 명령줄 cmd에서 '<' 문자를 사용하지 않고 sql 스크립트를 실행합니다.실행 (0) | 2023.01.22 |
플레인 URL을 링크로 대체하려면 어떻게 해야 합니까? (0) | 2023.01.22 |
-XX의 차이:+ParallelGC 및 -XX 사용:+UseParNewGC (0) | 2023.01.22 |