썸머노트에서 이미지 업로드하기
썸머노트에서 이미지를 서버에 올리려면 일단 아래와 같이 별도의 onImageUpload 핸들러를 구현해야한다.
var $editor = $('#editor');
var editor = $editor.summernote({
... 옵션 생략 ...
onImageUpload: function(files) {
sendFile(files[0]);
}
});
위에서 사용한 sendFile 함수는 아래와 같이 구현한다. 이때 ajax 옵션에 주의하자. 별거아닌 옵션을 실수로 잘못주면 하루종일 이유도 모르고 헤맬수있다. 특히 contentType은 없어야한다. 파일 업로드라고 종종 contentType을 “multipart/form-data”로 설정하는 경우가 있는데, 본래 XMLHttpRequest 객체는 파일 업로드를 지원하지 않기 때문에 파일 업로드를 위해서는 XHR2와 FormData 객체를 이용해야한다. 참고로 XHR2는 거의 모든 최신 브라우저에서 사용할수있다.
function sendFile(file) {
var data = new FormData();
data.append("file", file);
$.ajax({
type: "POST",
url: "/api/upload/image",
type: 'POST',
data: data,
contentType: false,
processData: false, // Don't process the files
success: function(data) {
$('#editor').summernote("insertImage", data.url);
}
});
}
간혹 no multipart boundary was found 라는 오류가 발생하면 바로 컨텐츠 타입을 의심해보면 된다.
업로드 서버 구현하기
이제 파일을 업로드를 해줄 서버를 구현해보자. 노드로 구현할때 나는 주로 쓰는 multer라는 모듈을 사용한다. 사용법 또한 무지 간단하다.
var router = express.Router();
var multer = require('multer');
var upload = multer({
dest: 'uploads/'
});
router.post('/upload/image', upload.single('file'), function(req, res){
console.log(req.file);
});
하지만 간단하다고 생각할때 아래와 같은 에러를 만나게 된다.
위 두 에러는 ajax로 파일을 업로드할때 파일내용을 request body에 써버 보내게 되는데 바로 그 바디의 크기 제한에 걸려나 나는 문제다. 이럴땐 당황하지 말고 아래와 같이 설정한다.
app.use(bodyParser.urlencoded({limit: '5mb', extended: false, parameterLimit: 10000}));
물론 node 앞딴에 Nginx 같은 스태틱 서버를 두는 경우엔 nginx 설정에도 업로드 사이즈를 설정해야한다.
관련글은 검색하면 쉽게 찾을수있다.
http {
#...
client_max_body_size 100m;
#...
}