Program Club

Node.js에서 POST 요청을 사용하여 파일 업로드

proclub 2020. 11. 4. 20:59
반응형

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

반응형