2016-11-21 11 views
1

TIdHTTP을 사용하여 파일을 업로드하려고합니다. 문제는 요청이 서버로 전송 될 때 액세스 토큰이 변경된다는 것입니다. 내가 사용델파이 - TIdMultipartFormDataStream을 사용하는 idHTTP 업로드 파일

액세스 토큰 fJNhDM6TlcpeVmD8h3jFuPJS71sxwZB8bZBXajTRB5TNAcRa6PNXfv4J7mPxIvMdMhjy7oKdTLbsRYthpBCCqGVkj4vlojJ4BRBkLAVIBJ1DZAnMZD

이 API는 =\r\n있다

HTTP/1.1 400 Bad Request OAuth "invalid_token" "Malformed access token fJNhDM6TlcpeVmD8h3jFu=\r\nPJS71sxwZB8bZBXajTRB5TNAcRa6PNXfv4J7mPxIvMdMhjy7oKdTLbsRYthpBCCqGVkj4v=\r\nlojJ4BRBkLAVIBJ1DZAnMZD"

두 번 내 토큰에 추가 반환합니다.

내 코드입니다 : 내가 여기에 무엇을 놓치고

function TFoo.Post(const AToken, guID, AMessage, AImageFileName: string): Boolean; 
var 
    lParam : TIdMultipartFormDataStream; 
begin 
    Result := False; 
    if not FileExists(AImageFileName) then begin 
    LastError := 'File not found ' + AImageFileName; 
    Exit; 
    end; 
    ProxyCheck; 
    lParam := TIdMultipartFormDataStream.Create; 
    try 
    lParam.AddFormField('message', AMessage); 
    lParam.AddFormField('access_token', AToken); 
    lParam.AddFile('source', AImageFileName); 
    idHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
    try 
     idHTTP.Post(UrlAPI + guID + '/photos', lParam); 
     Result := True; 
    except; 
     LastError := idHTTP.ResponseText + sLineBreak + idHTTP.Response.WWWAuthenticate.Text; 
    end; 
    finally 
    lParam.Free; 
    end; 
end; 

?

답변

1

기본적으로 AddFormField()TIdFormDataField.ContentTransfer 속성을 MIME의 quoted-printable 형식으로 설정합니다. 그것이 여분의 =\r\n이 나오는 곳입니다. quoted-printable에 76 자마다 삽입되는 "부드러운"줄 바꿈입니다. quoted-printable을 지원하는 서버는 디코딩 중에 "소프트"줄 바꿈을 제거합니다. 하지만 서버가 그렇지 않을 수도 있습니다. 당신이 quoted-printable 동작을 해제하려면

, 당신은에 ContentTransfer 속성을 설정할 수 있습니다 :

  1. 빈 문자열 :

    lParam.AddFormField('access_token', AToken).ContentTransfer := ''; 
    
  2. '7bit'이 (가 비를 포함하지 않기 때문에 -ASCII 문자) :

    lParam.AddFormField('access_token', AToken).ContentTransfer := '7bit'; 
    
  3. '8bit' 또는 binary는 :

    이 경우
    lParam.AddFormField('access_token', AToken).ContentTransfer := '8bit'; 
    

    lParam.AddFormField('access_token', AToken).ContentTransfer := 'binary'; 
    

, 나는 # 1 건의 할 것입니다.

참고로 TIdMultipartFormDataStream을 게시 할 때 HTTP 콘텐츠 유형을 설정하지 마십시오. 처음에 잘못된 미디어 유형을 사용하고 있는데 (대신 multipart/form-data이어야 함), Post()TIdMultipartFormDataStream 버전은 간단히 덮어 씁니다.

function TFoo.Post(const AToken, guID, AMessage, AImageFileName: string): Boolean; 
var 
    lParam : TIdMultipartFormDataStream; 
begin 
    Result := False; 
    if not FileExists(AImageFileName) then begin 
    LastError := 'File not found ' + AImageFileName; 
    Exit; 
    end; 
    ProxyCheck; 
    lParam := TIdMultipartFormDataStream.Create; 
    try 
    lParam.AddFormField('message', AMessage); 
    lParam.AddFormField('access_token', AToken).ContentTransfer := ''; 
    lParam.AddFile('source', AImageFileName); 
    try 
     idHTTP.Post(UrlAPI + guID + '/photos', lParam); 
     Result := True; 
    except; 
     LastError := idHTTP.ResponseText + sLineBreak + idHTTP.Response.WWWAuthenticate.Text; 
    end; 
    finally 
    lParam.Free; 
    end; 
end;