2016-11-21 18 views
1

TIdHTTPを使用してファイルをアップロードしようとしています。問題は、要求がサーバーに送信されるときにアクセストークンが変更されることです。私が使用しているDelphi - TIdMultipartFormDataStreamを使用したidHTTPアップロードファイル

アクセストークンがfJNhDM6TlcpeVmD8h3jFuPJS71sxwZB8bZBXajTRB5TNAcRa6PNXfv4J7mPxIvMdMhjy7oKdTLbsRYthpBCCqGVkj4vlojJ4BRBkLAVIBJ1DZAnMZD

APIが

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

を返している=\r\nは二回、私のトークンにあります追加されます。

私のコードは次のとおりです。

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プロパティを設定することができます:それは以外が含まれていないので、

lParam.AddFormField('access_token', AToken).ContentTransfer := ''; 
  • '7bit'(:

    1. 空の文字列を-ASCII文字):

      lParam.AddFormField('access_token', AToken).ContentTransfer := '7bit'; 
      
    2. '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; 
    
  • 関連する問題