여기에서 첫 번째 파라를 읽으십시오!
나는 이것이 3 년이 너무 늦다는 것을 알고 있지만 Matt의 (허용 된) 대답은 불완전하며 결국 당신을 곤경에 빠지게 할 것입니다. 여기서 핵심은을 사용하도록 선택한 경우 서버가 결국 수신하는 파일 데이터에 multipart/form-data
경계가 표시 되지 않아야 한다는 것입니다.
application/x-www-form-urlencoded
경계가 없기 때문에 문제가되지 않습니다 . x-www-form-urlencoded
또한 임의의 바이트 하나를 3 7BIT
바이트 로 간단하게 전환하여 이진 데이터를 항상 처리 할 수 있습니다 . 비효율적이지만 작동합니다 (이진 데이터뿐만 아니라 파일 이름을 보낼 수 없다는 의견은 정확하지 않습니다. 다른 키 / 값 쌍으로 보내십시오).
문제 multipart/form-data
는 파일 데이터에 경계 구분 기호가 없어야한다는 것입니다 ( RFC 2388 참조 ; 섹션 5.2에는이 문제를 피하는 적절한 집계 MIME 유형이 없기 때문에 다소 절름발이가 포함되어 있습니다).
그래서, 첫눈에, multipart/form-data
에없는 값 전혀입니다 어떤 파일 업로드 바이너리 또는 그렇지 않으면. 당신이 제대로 경계를 선택하지 않은 경우, 당신은 것입니다 서버가 잘못된 장소에서 경계를 발견 할 것이다, 당신의 파일이 잘립니다, 또는 POST - 결국 일반 텍스트 또는 원시 바이너리를 전송하고 있는지, 문제가 실패합니다.
핵심은 선택한 경계 문자가 인코딩 된 출력에 나타나지 않도록 인코딩 및 경계를 선택하는 것입니다. 간단한 해결책 중 하나는 사용 base64
하지 않는 것입니다 (원시 바이너리는 사용 하지 마십시오 ). 에서는 베이스 64 (3), 임의의 바이트가 상기 출력 된 문자 세트는 4 개의 7 비트 문자로 부호화된다 [A-Za-z0-9+/=]
(즉, 영숫자, '+', '/'또는 '='). =
는 특별한 경우이며 인코딩 된 출력의 끝에 단일 =
또는 double 로만 나타날 수 있습니다 ==
. 이제 base64
출력에 나타나지 않는 7 비트 ASCII 문자열로 경계를 선택하십시오 . 인터넷에서 볼 수있는 많은 선택이이 테스트에 실패합니다. MDN 양식 문서예를 들어, 이진 데이터를 전송할 때 "blob"를 경계로 사용하십시오. 그러나 "! blob!"와 같은 것 base64
출력에 나타나지 않습니다 .