2016-08-03 3 views
3

에서 부분적인 데이터를 nodejs, 나는 POST 요청을 관리 할 수있는 다음 코드 조각이 - 나는 다음과 같은 예외를 가지고 파일을 업로드하려고 할 때내가 서버가 nodejs에서 실행이 단지 파이어 폭스

form.on('file', function (field, file) { 
    var RecordingInfo = JSON.parse(file.name); 
... 

을 :

undefined:1 
"} 


SyntaxError: Unexpected end of input 
    at Object.parse (native) 
    at IncomingForm.<anonymous> (.../root.js:31:34) 
... 

searching around the web

, I 데이터 비트에 제공하고, 이벤트가 첫 번째 비트는 도착 후 해고, 나는 모든 데이터를 가지고 있지 않기 때문에이 예외가 발생하는 것을 좋아한다. 승인. 문제는 약간의 테스트 후에 크롬에서 firefox가 서버를 6kb 파일과 충돌시키는 동안 문제없이 큰 파일 (1.75gb 파일을 시도)을 업로드 할 수 있다는 점입니다.

제 질문은 - 왜 다른가요?

샘플 캡처는 here 양식을 다운로드 할 수 있습니다. 첫 번째 게시물은 크롬에서 가져 왔으며 두 번째 게시물은 Firefox에서 가져 왔습니다.

업로드하기 전에 완전한 file.name 문자열 :

// chrome 
"{"subject":"flksajfd","lecturer":"אבישי וינר","path":"/גמרא","fileType":".png"}" 
// firefox 
"{"subject":"fdsa","lecturer":"אלקס ציקין","path":"/גמרא","fileType":".jpg"}" 

(제출 된 데이터가없는 동일하지만, 나는 그것이 중요한 생각하지 않는다)

크롬에서 큰 따옴표를 인코딩한다
+0

FF와 크롬의 입력 사이의 DIFF는 무엇입니까? – Oleander

+0

@Oleander wireshark에서 캡쳐를 추가했습니다. – elyashiv

답변

2

JSON으로 인코딩 된 "파일 이름"은 %22이며, Firefox는이 파일을 \"으로 인코딩합니다.

파일 업로드 구문 분석 라이브러리 Formidable (명시 적으로 truncates the filename from the last \ character). RFC 2616은 Firefox처럼 백 슬래시로 이스케이프 된 따옴표를 허용하지만 이중 따옴표는 %22으로 인코딩 될 것으로 예상합니다. Formidable에서 버그라고 생각할 수 있습니다. 다음

'{"subject":"fdsa",...,"fileType":".jpg"}' 

... 인코딩 :

'{%22subject%22:%22fdsa",...,%22fileType%22:%22.jpg%22}' // Chrome 
'{\"subject\":\"fdsa\",...\"fileType\":\".jpg\"}' // Firefox 

... 후 가공 할 복호 : 결과는 다음 JSON 문자열이다

'{"subject":"fdsa",..."fileType":".jpg"}' // Chrome 
'"}' // Firefox 

것은 해결하는 몇 가지 선택 사항이 있습니다.

  1. Raise the issue with Formidable 백 슬래시로 이스케이프 된 따옴표로 묶인 값 문자열을 올바르게 처리하거나 직접 수정하고 끌어 오기 요청을 제출하십시오.
  2. FormData 개체의 별도 부분에 JSON 페이로드를 보냅니다. 예 : using a Blob.
  3. JSON 형식 파일 이름의 모든 큰 따옴표 문자를 문자열의 다른 곳에 나타나지 않는 '안전한'문자로 변환합니다 (예 : ^을 선택했습니다). 따옴표 클라이언트 측을 대체하고 다음과 같이 그것을 서버 측에 복직하십시오.

클라이언트 :

var formData = new FormData(); 
    formData.append('file', $scope.recording, JSON.stringify(RecordingInfo).replace(/"/g, '^'); 

서버

form.on('file', function (field, file) { 
    var RecordingInfo = JSON.parse(file.name.replace(/\^/g, '"'); 
+0

은 nodejs JSON.parse ("{\"test \ ": 3}")에서 실행되는 트릭을 수행하지 않는 것처럼 보이며 오류가 아닌'{test : 3}'을 산출합니다. 또한, 아주 이상하게, 나는 닫는 괄호를 얻는 반면, 당신의 이론에 따르면 나는 여는 괄호를 얻어야한다. – elyashiv

+0

문자열이 JSON.parse에 도달하기 전에 문자열이 엉망이되었다고 생각합니다. 문자열 인쇄를 시도 했습니까? – Owen

+0

동일 - FF :'name : "{"subject ":"fdsa ","lecturer "... chrome :'name :"{ "subject": "flksajfd", "lecturer"...' – elyashiv