2017-05-18 4 views
0

html5 캔버스에서 생성 된 이미지를 mysql 데이터베이스에 저장하려고합니다. base64 형식으로 이미지를 삽입하는 방법은 알고 있지만 base64는 저장 공간이 33 % 더 늘어날 것이므로 BLOB 또는 파일로 저장하려고하지만이 두 가지 방법으로 문제가 있습니다. 다른 페이지에서 ajax 메서드로 base64 문자열을 받고 $ _POST [ "image"]를 사용하여 가져옵니다.base64 이미지를 PHP의 mysql 테이블에 삽입하십시오

$data = $_POST["image"]; 
    $data = str_replace('data:image/png;base64,', '', $data); 
    $data = str_replace(' ','+',$data); 

    $data = base64_decode($data); 
    $sql=mysql_query("INSERT INTO capimages(image)VALUES('$data')"); 

하지만 테이블 아무것도 열지 경우 실제로 삽입있어 : 내 첫 번째 시도는 BLOB으로 이미지를 저장하는 것입니다.

파일 경로로 저장하려면 file_put_content 또는 imagepng 파일을 데이터베이스에 저장하는 방법을 이해하지 못합니다. 삽입 문과 함께 sql 쿼리가 없기 때문입니다. 나는 다음과 같은 코드를 시도했지만 그것을 실행 한 후 내 테이블에서 아무것도 찾을 수 없습니다 :

define('upload_dir', 'images/'); 
    $img = $_POST["image"]; 
    $img = str_replace('data:image/png;base64,', '', $img); 
    $img = str_replace(' ', '+', $img); 
    $data = base64_decode($img); 
    $file = uploaddir . uniqid() . '.png'; 
    $success = file_put_contents($file, $data); 

사람이 어떻게 이미지를받은 후 BLOB으로 또는 파일 경로로 중 하나를 테이블에 저장하는 저를 보여줄 수를 base64 형식으로? 또한 내 웹 사이트에 많은 양의 볼륨이 필요하지 않으면 base64 형식이 33 % 더 많은 저장 공간을 차지하는 것이 중요합니까?

+0

** 경고가 ** : 당신은 그냥 PHP를 학습하는 경우는 사용하지 마십시오 ['mysql_query'] (http://php.net/manual/en/function.mysql-query.php) 인터페이스. PHP 7에서 제거 된 것은 너무 무섭고 위험합니다. [PDO는 배우기가 어렵지 않습니다.] (http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps -pdo-for-database-access /)와 [PHP The Right Way] (http://www.phptherightway.com/)와 같은 가이드가 모범 사례를 설명합니다. 귀하의 사용자 데이터는 ** [적절하게 이스케이프되지 않은] ** (http://bobby-tables.com/php.html)이 아니며 [SQL 주입 버그] (http://bobby-tables.com/)가 있으며 착취 당한다. – tadman

+1

Pro Tip : 데이터베이스에 이미지를 저장하지 마십시오. 서버를 클라이언트에 전달하는 것은 매우 불편합니다. 데이터베이스 테이블에서 소켓으로 가져 오는 데 필요한 많은 인코딩 및 디코딩 계층이 있으며, 백업 할 때 매우 고통 스러울 정도로 데이터베이스가 부 풀릴 수 있습니다. 복원합니다. Riak이나 [Amazon S3] (https://aws.amazon.com/s3/)와 같은 파일 시스템이나 객체 저장소에 저장하고 대신 파일 경로 나 URL을 저장하십시오. – tadman

+0

** 강하게 ** 여기에 내 대답을 살펴볼 것을 제안합니다. http://stackoverflow.com/questions/38509334/full-secure-image-upload-script/38712921#38712921 방문자가 완전히 제어 할 수 있음을 기억하십시오. 요청 헤더를 통해 보안에 대해 아무 것도하지 않으면 서버에 아주 나쁜 물건을 업로드 할 수 있습니다. 저기서의 대답은 단계별로 당신을 걸어 갈 것입니다. – icecub

답변

2

일반적으로 관계형 데이터베이스에 이미지를 저장하고 싶지는 않습니다.

하지만 원하는대로.

첫째 : 이미지를 저장하는 테이블을 작성

여기 MySQLi (mysqli manual)를 사용하여 BLOB를 저장하는 코드입니다. 다음

CREATE TABLE `test` (
    `id` int(11) NOT NULL, 
    `content` blob NOT NULL 
) 

:

<?php 
$host = 'localhost'; 
$user = 'root'; 
$pass = 'root'; 
$db_name = 'test'; 

$base64_data = $_POST['base64_data']; 

$link = mysqli_connect($host, $user, $pass, $db_name); 

$stmt = mysqli_prepare($link, "INSERT INTO test (id, content) VALUES (?, ?)"); 

$stmt->bind_param('ib', $id, $content); 

$id = 1; 

$content = null; 

//$base64_data = base64_decode(base64_encode(file_get_contents('3413983627135443.jpg'))); 
//$stmt->send_long_data(1, $base64_data); 
$stmt->send_long_data(1, base64_decode($base64_data)); 

mysqli_stmt_execute($stmt); 
printf("%d Row inserted.\n", mysqli_stmt_affected_rows($stmt)); 
mysqli_stmt_close($stmt); 

사용하지 마십시오 MySQL을 (원본) 확장 : intro.mysql

관련 문제