이런 식으로 엄~청나게 긴 base64 코드로 이미지가 인코딩되어 들어간다. 이는 사진이 늘어나면 늘어날수로 DB가 터져나간다는 뜻이다. 그리고 mysql 의 mediumtext는 최대 16MB 의 길이만 저장할 수 있는데, 자칫 크기가 큰 사진이 들어오면 이 용량을 초과해서 문제가 생길 수 있다.
그래서 어떻게 해야 할지 고민하다가, 무료 이미지 호스팅 서비스를 이용하기로 했다.
무료 이미지 호스팅을 지원하는 사이트는 postimage, imgbb 등등 여러가지가 있는데, 나는 이중 imgbb를 사용하기로 했다. API가 가장 심플하게 설명이 되어 있었기 때문이다.
sendFile 함수에서는 POST요청으로 먼저 서버에 이미지를 전송한다. processData 옵션은 true로 해두면 jquery에서 내부적으로 쿼리로 바꿔서 전달하기 때문에 파일전송시에는 false 로 둔다.
router.post('/imageUpload',multipartMiddleware,function(req,res){
f = fs.readFileSync(req.files.file.path);
base64 = Buffer.from(f).toString('base64');
var imgbbAPI = require('../imgbbAPIkey.json'); // API KEYconst options = {
uri:'https://api.imgbb.com/1/upload?expiration=600&key='+imgbbAPI.key,
method: 'POST',
form: {
image:base64, // 이미지 첨부
},
json: true// json 형식으로 응답
}
request.post(options, function(error,httpResponse,body){
if(error){
res.send({error: error});
} else{
res.send({url: body.data.display_url});
}
});
});
imgUpload에서는 먼저 file system 모듈로 파일을 읽어들여서 base64 코드로 인코딩한다. 그 뒤 서버에서 imgbb 서버로 url을 만들어서 요청을 보내주면 된다. (이를 위해 request 모듈이 필요하다)
API KEY의 경우 따로 json 파일을 만들어서 저장해놓은 뒤, 버전관리에서 빼 놓는다.
이렇게 적용하고 나서 이미지를 업로드하면,
이렇게 잘 보인다. 이제 DB를 확인해보면,
<p><imgstyle='width: 340px;'src='https://i.ibb.co/y00zW95/c1d01001fc20.png'></p><p><br></p><p>이미지 업로드가 base64로 DB에 직접 저장되는것이 아닌 imgbb 서버에 업로드하여 링크만 거는 형식으로 잘 적용되었는지 확인해보아야 한다.</p>
이런식으로 base64 코드가 통째로 들어있는게 아닌 사진링크만 가져온 것을 확인할 수 있다.