2012-08-22 2 views
1

저희 회사는 서버 측 프로그램이 javacript (node.js가 아닌)로 작성된 propitiatory 응용 프로그램 서버를 사용합니다. 이것은 아주 초기 일 및 지원 여기자바 스크립트를 사용하여 formdata 객체를 구문 분석

이제 좋지 않아 내 문제입니다 : How can I upload files asynchronously?에서 내가 ... 내가 슈퍼 답을 사용하고있는 서버 측 업로드 된 CSV를 처리하는 데

(jquery와 formdata 객체 전달하기) 그리고 나는 서버 측에서 보낸 파일에 접근 할 수있다. 하지만 어떻게 해석해야합니까?

그것은이

 
------WebKitFormBoundaryU5rJUDxGnj15hIGW 
Content-Disposition: form-data; name="fileToUpload"; filename="test.csv" 
Content-Type: application/vnd.ms-excel 

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

------WebKitFormBoundaryU5rJUDxGnj15hIGW-- 

처럼 서버 측에 일반 자바 스크립트로이 파일을 처리하는 방법을 정말 혼란 스러워요 보인다.

도와주세요.

답변

0

그래, 나는 스스로 이것을 할 수 있었다. 필자는 몇 개의 브라우저에서 그것을 테스트하여 헤더가 3 줄이고 바닥 글이 1 줄임을 알았습니다.

줄 바꿈 문자로 파일을 나눠서 줄 단위로 배열에 넣는 간단한 구문 분석기를 작성했습니다.

이렇게하면 지금까지 처리하는 데 도움이됩니다.

function doProcess() 
{ 

var i=0; 
var str = ''; 
var arrayList = []; 

for (i=0;i<fileContent.length;i++) 
{ 
    if (fileContent[i] !== '\n') 
    { 
     str += fileContent[i]; 
    } 
    else 
    { 
     str = str.replace("\r",""); 
     if (trim(str) !== "") 
     { 
      arrayList.push(str); 
     } 
     str = ''; 
    } 
} 

    // Remove header 
    arrayList.splice(0,3); 

    // Remove footer 
    arrayList.splice(arrayList.length-1,1); 

    // arrayList is an array of all the lines in the file 
    console.log(arrayList); 
} 
11

최상의 것은 node-formidable입니다. browserify하고 polyfill하십시오. 독립 실행 형 파서는 문자열 응답과 원시 응답 모두에서 작동합니다. 원시 자료에는 최신 브라우저를 사용해야합니다.

/* 
* MultiPart_parse decodes a multipart/form-data encoded response into a named-part-map. 
* The response can be a string or raw bytes. 
* 
* Usage for string response: 
*  var map = MultiPart_parse(xhr.responseText, xhr.getResponseHeader('Content-Type')); 
* 
* Usage for raw bytes: 
*  xhr.open(..);  
*  xhr.responseType = "arraybuffer"; 
*  ... 
*  var map = MultiPart_parse(xhr.response, xhr.getResponseHeader('Content-Type')); 
* 
* TODO: Can we use https://github.com/felixge/node-formidable 
* See http://stackoverflow.com/questions/6965107/converting-between-strings-and-arraybuffers 
* See http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html 
* 
* [email protected] 2013-2014 Wolfgang Kuehn, released under the MIT license. 
*/ 
function MultiPart_parse(body, contentType) { 
    // Examples for content types: 
    //  multipart/form-data; boundary="----7dd322351017c"; ... 
    //  multipart/form-data; boundary=----7dd322351017c; ... 
    var m = contentType.match(/boundary=(?:"([^"]+)"|([^;]+))/i); 

    if (!m) { 
     throw new Error('Bad content-type header, no multipart boundary'); 
    } 

    var boundary = m[1] || m[2]; 

    function Header_parse(header) { 
     var headerFields = {}; 
     var matchResult = header.match(/^.*name="([^"]*)"$/); 
     if (matchResult) headerFields.name = matchResult[1]; 
     return headerFields; 
    } 

    function rawStringToBuffer(str) { 
     var idx, len = str.length, arr = new Array(len); 
     for (idx = 0 ; idx < len ; ++idx) { 
      arr[ idx ] = str.charCodeAt(idx) & 0xFF; 
     } 
     return new Uint8Array(arr).buffer; 
    } 

    // \r\n is part of the boundary. 
    var boundary = '\r\n--' + boundary; 

    var isRaw = typeof(body) !== 'string'; 

    if (isRaw) { 
     var view = new Uint8Array(body); 
     s = String.fromCharCode.apply(null, view); 
    } else { 
     s = body; 
    } 

    // Prepend what has been stripped by the body parsing mechanism. 
    s = '\r\n' + s; 

    var parts = s.split(new RegExp(boundary)), 
     partsByName = {}; 

    // First part is a preamble, last part is closing '--' 
    for (var i=1; i<parts.length-1; i++) { 
     var subparts = parts[i].split('\r\n\r\n'); 
     var headers = subparts[0].split('\r\n'); 
     for (var j=1; j<headers.length; j++) { 
     var headerFields = Header_parse(headers[j]); 
     if (headerFields.name) { 
      fieldName = headerFields.name; 
     } 
     } 

     partsByName[fieldName] = isRaw?rawStringToBuffer(subparts[1]):subparts[1]; 
    } 

    return partsByName; 
} 
관련 문제