2012-10-30 4 views
0

mySQL/PHP에서 이미지를 처리하는 함수를 작성하려고하지만 결과를 저장하는 방법을 찾을 수 없습니다. 문제를 설명하기 위해 코드를 제거했습니다.이미지를 데이터베이스에 BLOB 형식으로 저장할 수 있습니까?

image.image_o의 얼룩은 모두 올바르게 저장되어 웹 페이지에 이미지를 출력하는 데 사용할 수 있습니다. 이 함수는 오류없이 실행되지만 image.image_r의 blob은 단지 몇 바이트 길이이며 "Resource id # 5"와 같은 텍스트를 포함합니다.

나는 바보 같은 짓을하고 있다고 확신합니다. .

function process_images(){ 
    global $mysql 
    $sql = "select id, image_o from image"; 
    $res = mysqli_query($mysqli, $sql); 
    if ($res){ 
     while ($ay = mysqli_fetch_array($res, MYSQLI_ASSOC)){ 
      $id = $ay['id']; 
      $im = imagecreatefromstring($ay['image_o']); 
      // do something useful with the image 
      $sql2 = "update image set image_r = '{$im}' where id = $id"; 
      $res2 = mysqli_query($mysqli, $sql2); 
      if ($res2){ 
       // blah blah 
      }else{ 
       echo mysqli_error($mysqli)." in res2"; 
      } 
     } 
    }else{ 
     echo mysqli_error($mysqli)." in res"; 
    } 
} 
+5

데이터베이스에 이미지를 저장하는 것이 좋지 않습니까? 당신은을 위해 공연을 죽이고 있습니까? ... – Layke

+0

이미지를위한 데이터베이스는 적합하지 않습니다. 이미지를 일반 파일 시스템에 저장하고 참조 (파일 이름 + 경로 등)를 DB에 보관하십시오. –

+0

나는 일반적으로 위와 동의합니다. Devil을지지하기 위해 여러 개의 응용 프로그램 서버와 하나의 db가있는 경우 db에 파일을 저장하고 싶지만 호스팅 제한이나 기타 제한 사항으로 인해 공유 파일 시스템을 설정하는 좋은 방법은 없습니다. 확실히 이상적은 아니지만 그게 중요한 것은 아닙니다. –

답변

0

위의 논평에 동의하는 것은 일반적으로 바람직하지 않습니다. 그러나, 당신이 그것을 할 수있는 이유와 방법에 대한 훌륭한 기사가 여기 있습니다. 또한 데이터베이스에 이미지를 저장하는 것에 대한 단점을 강조하고 있습니다.

http://forum.codecall.net/topic/40286-tutorial-storing-images-in-mysql-with-php/

당신은 당신이 필드에 데이터를 읽을 수 있는지 확인해야합니다. 다만 파일 포인터 : 간단히 말해서

// Temporary file name stored on the server 
$tmpName = $_FILES['image']['tmp_name']; 

// Read the file 
$fp  = fopen($tmpName, 'r'); 
$data = fread($fp, filesize($tmpName)); 
$data = addslashes($data); 
fclose($fp); 

// Now take the contents of data and store THAT 

, 수익을 imagecreatefromstring 파일 자체가 아닌 내용 "이미지 리소스는 성공에 반환됩니다." 저장하기 전에 해당 리소스의 내용을 읽어야합니다. 코드를 사용하여 다음과 같이 변경하십시오.

function process_images(){ 
    global $mysql 
    $sql = "select id, image_o from image"; 
    $res = mysqli_query($mysqli, $sql); 
    if ($res){ 
     while ($ay = mysqli_fetch_array($res, MYSQLI_ASSOC)){ 
      $id = $ay['id']; 
      $im = imagecreatefromstring($ay['image_o']); 
      $tempFileName = '/tmp/' . $id . 'jpg'; 
      $imTempFile = imagegd($im, $tempFileName); 
      $fh = fopen($tempFileName, "r"); 
      $data = fread($fh, filesize($tempFileName)); 

      // do something useful with the image 
      $sql2 = "update image set image_r = '{$data}' where id = $id"; 
      $res2 = mysqli_query($mysqli, $sql2); 
      if ($res2){ 
       // blah blah 
      }else{ 
       echo mysqli_error($mysqli)." in res2"; 
      } 
      //delete the temp file 
      unlink($tempFileName); 
     } 
    }else{ 
     echo mysqli_error($mysqli)." in res"; 
    } 
} 
+0

안녕하세요 Joshua, 답장을 보내 주셔서 감사합니다.하지만 내 BLOB가 원본 파일에 대한 참조 일 뿐이며 실제 이미지는 전체 이미지가 포함 된 코드화 된 문자열입니다. 제안한 코드는 "fread() : 제공된 리소스가 유효한 스트림 리소스가 아닙니다"라고합니다. –

+0

예, 추가 검사를 통해 데이터베이스의 이미지를 한 열에서 가져 와서 다른 열로 다시 가져 오려고하는 것처럼 보입니까? 왜 네가 이럴 수 있을지 모르겠다. "$ im = imagecreatefromstring ($ ay [ 'image_o']);"라는 줄에서 $ im에 var 덤프를 시도하십시오. 나는 네가 무엇을 얻고 있는지 궁금해. 파일 포인터 여야하지만 $ ay [ 'image_o']가 이미지로 해석 될 수없는 경우 오류가 발생합니다. 이미지가 저장되는 지점에서 다시 시작해야 할 수도 있습니다. –

+0

맞아, 내 예제 코드는 이미지를 한 열에서 다른 열로 복사하려고 시도한다. 실제 코드는 GD에서 이미지를 조작하지만 문제를 강조하기 위해 제거했습니다. image.image_o의 이미지는 괜찮습니다. 웹 페이지에서 이미지를 제공하기 위해 이미지를 사용할 수 있기 때문에이 사실을 알고 있습니다. 코드에서 모양을 조작하려는 방식에 문제가 있습니다. 무엇을 모르는 것입니까?imagecreatefromstring ($ ay [ 'image_o']) 호출은 GD가 조작 할 수있는 객체를 생성합니다. 나는 역함수를하는 함수를 원한다고 생각한다. "stringcreatefromimage", 문제는 존재하지 않는다. –

관련 문제