2013-04-12 2 views
0
내가 서버에 파일을 업로드 폰갭을 사용하고 그것은 하나의 예외와 함께 잘 작동

이 ...은 폰갭은

var options = new FileUploadOptions(); 

options.fileKey = "file"; 
options.fileName = file.name; 

var params = new Object(); 

if($scope.SelectedNames.length >0){ 
params.shareWith = SelectedNames[0].id; 
//params.shareWith = [$scope.SelectNames[0].id,$scope.SelectNames[1].id]; 
} 

options.params = params; 

var ft = new FileTransfer();   
ft.upload(file.toURL(), "https://mysupersecret.url.com", win, fail, options, true); 
//the rest of it 

문제는 때때로 동일한 키의 여러 FileTransfer의 PARAMS,하지만 서로 다른 값을 추가 shareWith 매개 변수에 추가해야하는 여러 개의 "SelectedNames"가 있습니다. .shareWith를 배열로 설정하려고하면 작동하지 않습니다. POST 쿼리 문자열을 직접 만들려고했지만 그 중 하나가 작동하지 않습니다. 분명히 추가로 params.shareWith='xyz'을 호출하면 첫 번째 값을 덮어 씁니다.

생각하십니까?

가 나는의 쿼리 문자열에 제출하려는 :

shareWith = 값 1 & shareWith = 값 2 & shareWith =이 VALUE3

답변

0

현재 PhoneGap에서 FileTransfer를 구현하면이 작업이 까다로울 수 있지만 가능합니다. 문제는 게시물에 multipart/form-data 형식입니다. 서버가 제대로 다중 값과 ​​같은 매개 변수를 해석하는 경우, 원시 요청 페이로드는 다음과 같이, 같은 이름을 가진 내용 - 처리 라인의 시리즈를 가질 필요가 :

--AaB03x 
    Content-Disposition: form-data; name="shareWith[]" 

    Joe 

--AaB03x 
    Content-Disposition: form-data; name="shareWith[]" 

    Jim 

--AaB03x 
    Content-Disposition: form-data; name="shareWith[]" 

    Jane 

이름의 배열 표기법을 나타냅니다 매개 변수는 다중 값이며, 서버는이 매개 변수를 원하는 값의 배열로 해석합니다.

불행하게도,이 요청 페이로드 데이터를 덧붙 코르도바 libs와의 오브젝티브 C 코드 :

NSDictionary* options = [arguments objectAtIndex:5 withDefault:nil]; 
    ... 
    for (NSString* key in options) { 
      ... 
      [postBodyBeforeFile appendData:[[NSString stringWithFormat: 
       @"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] 
       dataUsingEncoding:NSUTF8StringEncoding]]; 

는 않는 모든 당신의 PARAMS 개체를 통해 반복이다가 (이 { param1: 'one', param2: 'two' } 같은 JS 객체를 기대한다 이 메소드 호출로 각 param 객체 키를 키에 건네줍니다. 값이 배열인지 확인하는 것이 현명하지 않습니다. 그렇다면 for 문에서 볼 수 있듯이 여러 Content-Disposition 행을 추가하면 각 키가 문자열로만 간주됩니다. 옵션 사전은 동일한 키를 사용하여 여러 값을 가질 수 없으므로 같은 값을 가진 Content-Disposition 행, 다중 값 매개 변수를 전송하는 데 필요한 방식으로 양식을 작성할 수 없습니다.

params = {} 
params['shareWith[0]'] = 'Joe'; 
params['shareWith[1]'] = 'Jim'; 
params['shareWith[2]'] = 'Jane'; 

서버의 결과는 약간 다를 수 있습니다 :

그러나이 같은 형태의 이름을 직접 구축하여 사용자가보다 적게보다는 우아한 방법으로 원하는 것을 달성 할 수 있어야한다 위에서 언급했듯이, 이것이 당신을 거기에서 가장 많이 얻을 것입니다. 다행히도이 문제는 앞으로 해결 될 것이며 FileTransfer를 사용하면 합리적으로 여러 값을 갖는 매개 변수를 사용할 수 있습니다.

+0

라이언 덕분에 내 프로그래밍을 다음 단계로 옮길 수있는 영감을 얻은 사람들이 있습니다. – bulltorious

+0

친절하게 답변 해 주셔서 감사합니다. 친절한 설명에 감사드립니다. –

+0

아침에 얼굴을 마주 쳤다. 조금이라도 추한다면 이것이 가능하다는 것을 깨달았다. 나는 그것이 다소 재미 있다고 생각하기 때문에 구현 물건을 남겼다. –

0

어떻게 SelectedNames 배열에서 업로드 큐를 만드는 방법에 대해? 하나가 완료된 후 배열에서 이동하여 왼쪽이 있는지 확인하십시오. 데모는 :

// Start the queue 
if(SelectedNames.length >0) 
{ 
    runQueue(); 
} 

function runQueue() 
{ 
    if(SelectedNames.length > 0) 
    { 
     var options = new FileUploadOptions(); 

     options.fileKey = "file"; 
     options.fileName = file.name; 

     var params = new Object(); 
     params.shareWith = SelectedNames[0].id; 
     options.params = params; 

     SelectedNames.shift(); 

     var ft = new FileTransfer(); 
     ft.upload(file.toURL(), "https://mysupersecret.url.com", runQueue, fail, options, true); 

    } 
    else 
    { 
     // ALL DONE 
    } 
} 
0

I는 다음과 같이 제안 :

params.shareWith0 = value1; 
params.shareWith1 = value2; 
params.shareWith2 = value3; 
//... 
params.shareWithCount = xy.Length; 

을 또는 당신은 결코 당신의 가치에 표시하지 않는 구분 기호를 사용할 수 있습니다. 더 적은 깨끗한

params.shareWith = [value1, value2, value3].join("~"); 

또 다른, 옵션은 jQuerys param()을 사용하는 것입니다.

$.param({shareWith: [value1, value2, value3]})