2012-11-12 6 views

답변

1

Dojo는 기본적으로이 작업을 수행하지 않을 것이라고 생각합니다. 클라이언트에서 멀티 파트를 처리하는 것은 일반적이 아닙니다. multipart-mime에 대한 고유 한 XHR 처리기를 만들어야합니다.

multipart format

접촉 식 제목에 지정된 경계에서 내용을 분할 :

eg. 
Content-Type: multipart/form-data; boundary=AaB03x 
이러한 부분을 분할 자바 스크립트에 간단한 사항 String.split (<REGX>)을 사용할 수 있습니다

. 그런 다음 개별 부분을 구문 분석해야합니다. 각 파트에는 고유 한 머리글 세트가 있고 내용은 Content-Type의 형식에 따라 인코딩됩니다.

첨부 파일을받는 경우 base64 인코딩을 사용하고있는 것 같습니다. 따라서 디코딩도해야합니다.

Dojo Base64 Encode/Decode

당신이 (당신이 그것을로드 한 후) 당신이 참고 표준의 XHR 호출에서 핸들러를 소유하고 사용하는 방법

  • .

    여기서 "mylib/multipart"에서로드 된 "multipart"라는 사용자 정의 처리기를 사용했습니다. Dojo를 사용하면 스크립트에서 수신 한 데이터를 구문 분석하기 위해 핸들러를로드하고로드 할 수 있습니다.

    NB : 브라우저의 보안으로 인해로드하는 페이지와 동일한 URL에있는 경우에만 XHR을 통해 데이터를로드 할 수 있습니다. (참조 : Stackoverflow conversation).

    나는 아래의 예를 들어 다중 처리기를 만들었습니다

    require([ 
        "dojo/_base/xhr", 
        "dojo/_base/array", 
        "dojo/_base/lang" 
    ], function(xhr, array, lang){ 
        lang.mixin(xhr.contentHandlers, { 
         "multipart": function(response){ 
          var parser = { 
           parse: function(response){ 
            var parts = new Array(); 
            var boundary = parser._getBoundary(response); 
            if(boundary){ 
             parts = parser._getParts(
              response.responseText, 
              boundary 
             ); 
            } 
            return parts; // return empty array if parsing could not be done 
           }, 
    
           _getBoundary: function(response){ 
            var contentType = response.getResponseHeader("Content-Type"); 
            if(/boundary\=/.test(contentType)){ 
             var parse = /boundary\=(.*?)(;|$)/.exec(contentType); 
             return parse[1]; 
            } 
            return false; // Return false if no boundary found 
           }, 
    
           _getParts: function(text, boundary){ 
            var parsed = new Array(); 
            var splitter =new RegExp(boundary+"[\r\n]+","g"); 
            var parts = text.split(splitter); // Split at the boundary 
    
            array.forEach(parts, function(part){ 
             var headBody = part.split("\n\n"); 
             if(headBody.length > 0){ 
              var head = lang.trim(headBody[0]); 
              var body = headBody[1]; 
              if(head != ""){ // Don't parse if no header, probably an error 
               parsed.push({ 
                "head": parser._parseHeaders(head), 
                "body":body 
               }); 
              } 
             } 
            }, this); 
    
            return parsed; 
           }, 
    
           _parseHeaders: function(headerText){ 
            // Headers should be in format: Header: Value 
            var header = {}; 
            var lines = headerText.split(/[\r\n]/); 
            array.forEach(lines, function(line){ 
             var parts = line.split(":"); 
             if(parts.length > 0){ 
              header[lang.trim(parts[0])] = lang.trim(parts[1]); 
             } 
            }, this); 
            return header; 
           } 
          }; 
    
          return parser.parse(response); 
         } 
        }); 
    }); 
    

    이 콘텐츠 객체의 배열로 XHR에서 반환 된 텍스트를 구문 분석합니다. 각 콘텐츠 개체는 원본 텍스트 본문이 포함 된 본문 특성과 머리글 개체가 포함 된 머리 특성을 포함해야합니다.

    일반 텍스트가 아닌 원시 컨텐트를 처리하려면 추가 코드를 작성해야합니다. 모든 상황에서 작동하는지 확인하기 위해 많은 테스트 데이터를 던질 수도 있습니다.

관련 문제