2017-01-26 6 views
0

원격 이미지 파일을 데이터베이스에 저장하려고하는데, 전에 한 번도 해 본 적이 없기 때문에 몇 가지 문제가 있습니다.node/request/sequelize/mysql을 사용하여 이미지 파일을 데이터베이스에 저장하십시오.

이미지를 다운로드하고 몇 가지 다른 속성이있는 이미지를 다운로드하여 다른 노드 api에 전달하여 (sequelize 사용) mysql 데이터베이스에 저장해야합니다. 나는 저장할 데이터를 얻을 수 있었지만, 수동으로 다운로드하여 열려고하면 실제로 사용할 수없고 이미지가 표시되지 않습니다.

저는 노드 요청으로 이미지를 가져 와서 base64 문자열로 변환하고 (어딘가에 대해 읽음) json 페이로드에 따라 전달했지만 작동하지 않았습니다. 멀티 파트로 보내려고했지만 그 중 하나도 작동하지 않았습니다. 스트림/버퍼/멀티 파트로 작업 한 적이 없으며 이전에는 결코 노드에 없었습니다. 노드 요청 파이프를 조사해 보았습니다. 그러나이 컨텍스트에 어떻게 적용 할 수 있는지 실제로 파악할 수 없었습니다. 여기

내가 현재 가지고있는의 (가 그래서는 일부의 ES6 클래스의 어떤 '기능'키워드 없습니다 또한, 요청이 promisified됩니다) : 나는 문제가이 부분에 거의 100 % 확신

function getImageData(imageUrl) { 
    return request({ 
     url: imageUrl, 
     encoding: null, 
     json: false 
    }); 
} 

function createEntry(entry) { 
    return getImageData(entry.image) 
     .then((imageData) => { 
      entry.image_src = imageData.toString('base64'); 
      var requestObject = { 
       url: 'http://localhost:3000/api/entry', 
       method: 'post', 
       json: false, 
       formData: entry 
      }; 
      return request(requestObject); 
     }); 
} 

왜냐하면 API가 가져온 것을 가져 와서 테이블에 넣기 위해 후속편으로 제공하기 때문에,하지만 잘못 될 수 있습니다. 이미지 필드는 longblob로 설정됩니다.

내가 알아 내면 간단 할 것이라고 확신하지만, 지금까지 나는 혼란 스럽다.

답변

2

이 질문에 대한 직접적인 대답은 아니지만 실제로 데이터베이스에 이미지를 저장할 필요는 거의 없습니다. 일반적으로 S3 에서처럼 CloudFront와 같은 CDN 또는 정적 파일 서버의 파일 시스템에 이미지를 저장 한 다음 파일 이름이나 이미지의 일부 ID 만 실제 데이터베이스에 저장합니다.

이미지를 일부 클라이언트에 제공 할 가능성이있는 경우 CDN 또는 파일 시스템 대신 데이터베이스에서 제공하는 것은 매우 비효율적입니다. 당신이 그 이미지를 제공하지 않는다면 실제로 데이터베이스에 넣을 이유가 거의 없습니다. 이미지의 특정 내용에 대해 데이터베이스를 쿼리하거나 사용하는 이미지 형식의 특정 serialization에 대한 결과를 정렬하지는 않습니다.

가장 간단한 방법은 고유 한 파일 이름 (임의의 문자열, UUID 또는 데이터베이스의 키)으로 이미지를 저장하고 필요한 다른 데이터로 데이터베이스의 ID 또는 파일 이름을 유지하는 것입니다. 효율적으로 서비스를 제공해야한다면 S3 또는 일부 CDN을 사용해보십시오.