Node.js에서 POST 요청을 사용하여 파일 업로드
Node.js에서 POST 요청을 사용하여 파일을 업로드하는 데 문제가 있습니다. 그것을 request달성 하기 위해 모듈 을 사용해야 합니다 (외부 npms 없음). 서버는 file파일의 데이터를 포함 하는 필드가 있는 다중 요청이어야 합니다. 쉬운 것처럼 보이는 것은 외부 모듈을 사용하지 않고 Node.js에서 수행하기가 매우 어렵습니다.
이 예제를 사용해 보았지만 성공하지 못했습니다.
request.post({
uri: url,
method: 'POST',
multipart: [{
body: '<FILE_DATA>'
}]
}, function (err, resp, body) {
if (err) {
console.log('Error!');
} else {
console.log('URL: ' + body);
}
});
이미 requestmodule을 사용하고있는 것 같습니다 .
이 경우 당신이 게시물에 필요한 것은 multipart/form-data그 사용하는 form기능을 :
var req = request.post(url, function (err, resp, body) {
if (err) {
console.log('Error!');
} else {
console.log('URL: ' + body);
}
});
var form = req.form();
form.append('file', '<FILE_DATA>', {
filename: 'myfile.txt',
contentType: 'text/plain'
});
하지만 파일 시스템에서 기존 파일을 게시하려면 읽기 가능한 스트림으로 전달하면됩니다.
form.append('file', fs.createReadStream(filepath));
request 모든 관련 메타 데이터를 자체적으로 추출합니다.
게시에 대한 자세한 내용 은에서 내부적으로 사용하는 모듈을multipart/form-data 참조하십시오 .node-form-datarequest
구현 하는 formData필드 의 문서화되지 않은 기능은 사용 request하는 form-data모듈에 옵션을 전달하는 기능입니다 .
request({
url: 'http://example.com',
method: 'POST',
formData: {
'regularField': 'someValue',
'regularFile': someFileStream,
'customBufferFile': {
value: fileBufferData,
options: {
filename: 'myfile.bin'
}
}
}
}, handleResponse);
이것은 호출을 피해야 requestObj.form()하지만 버퍼를 파일로 업로드 해야하는 경우에 유용 합니다. form-data모듈은 받아 contentType(MIME 타입) 및 knownLength옵션.
이 변경 사항 은 2014 년 10 월에 추가되었으므로 (이 질문을 요청한 지 2 개월 후) 지금 사용해도 안전합니다 (2017+). 이는의 버전 v2.46.0이상에 해당합니다 request.
Leonid Beschastny의 답변이 작동하지만 ArrayBuffer를 Node의 request모듈 에서 사용되는 Buffer로 변환해야했습니다 . 서버에 파일을 업로드 한 후 HTML5 FileAPI에서 가져온 것과 동일한 형식으로 파일을 가져 왔습니다 (Meteor를 사용하고 있습니다). 아래의 전체 코드-아마도 다른 사람들에게 도움이 될 것입니다.
function toBuffer(ab) {
var buffer = new Buffer(ab.byteLength);
var view = new Uint8Array(ab);
for (var i = 0; i < buffer.length; ++i) {
buffer[i] = view[i];
}
return buffer;
}
var req = request.post(url, function (err, resp, body) {
if (err) {
console.log('Error!');
} else {
console.log('URL: ' + body);
}
});
var form = req.form();
form.append('file', toBuffer(file.data), {
filename: file.name,
contentType: file.type
});
요청 라이브러리에서 "사용자 지정 옵션"지원을 사용할 수도 있습니다. 이 형식을 사용하면 여러 부분으로 구성된 양식 업로드를 만들 수 있지만 파일 이름이나 콘텐츠 유형과 같은 추가 양식 정보와 파일 모두에 대한 항목이 결합되어 있습니다. 일부 라이브러리, 특히 multer와 같은 라이브러리를 사용하여 파일 업로드를 수신 할 것으로 예상합니다.
이 접근 방식은 요청 문서의 양식 섹션 ( https://github.com/request/request#forms )에 공식적으로 문서화되어 있습니다.
//toUpload is the name of the input file: <input type="file" name="toUpload">
let fileToUpload = req.file;
let formData = {
toUpload: {
value: fs.createReadStream(path.join(__dirname, '..', '..','upload', fileToUpload.filename)),
options: {
filename: fileToUpload.originalname,
contentType: fileToUpload.mimeType
}
}
};
let options = {
url: url,
method: 'POST',
formData: formData
}
request(options, function (err, resp, body) {
if (err)
cb(err);
if (!err && resp.statusCode == 200) {
cb(null, body);
}
});
참고URL : https://stackoverflow.com/questions/25344879/uploading-file-using-post-request-in-node-js
'Program Club' 카테고리의 다른 글
| RestTemplate을 사용할 때 내부 Jackson 매퍼를 어떻게 구성 할 수 있습니까? (0) | 2020.11.04 |
|---|---|
| cmd 파일에서 %와 %%의 차이점은 무엇입니까? (0) | 2020.11.04 |
| Elixir : .ex 사용시기 및 .exs 파일시기 (0) | 2020.11.04 |
| Ubuntu에 설치된 GTK + 버전을 어떻게 알 수 있습니까? (0) | 2020.11.04 |
| Vertex 및 Pixel 쉐이더 란 무엇입니까? (0) | 2020.11.04 |