2012-04-26 9 views
6

का उपयोग कर निम्नलिखित डेल्फी XE2 (अपडेट 4) कोड का उपयोग करना:SignatureDoesNotMatch त्रुटि जब सामग्री प्रकार है 'पाठ/*' TAmazonStorageService.UploadObject

var 
    ConInfo: TAmazonConnectionInfo; 
    RespInfo: TCloudResponseInfo; 
    Service: TAmazonStorageService; 
    Content: TBytes; 
    Headers: TStringList; 
begin 
    ConInfo:=TAmazonConnectionInfo.Create(self); 
    ConInfo.AccountName:='YOUR ACCOUNT NAME'; 
    ConInfo.AccountKey:='YOUR ACCOUNT KEY'; 
    ConInfo.Protocol:='http'; 

    Service:=TAmazonStorageService.Create(ConInfo); 
    RespInfo:=TCloudResponseInfo.Create; 

    SetLength(Content, 128); 
    FillMemory(@Content[0], 128, Byte('x')); 

    Headers:=TStringList.Create; 
    Headers.Values['Content-type']:='text/plain'; 
    if not Service.UploadObject('YOUR BUCKET', 'test.txt', Content, TRUE, nil, Headers, amzbaPrivate, RespInfo) then 
    ShowMessage('Failed:' + RespInfo.StatusMessage); 

मैं हमेशा UploadObject को फोन पर कोई त्रुटि मिलती है:

विफल: HTTP/1.1 403 निषिद्ध - अनुरोध हस्ताक्षर हमने गणना की है आपके द्वारा प्रदान किए गए हस्ताक्षर से मेल नहीं खाता है। अपनी कुंजी जांचें और विधि पर हस्ताक्षर करें। (हस्ताक्षरDoesNotMatch)

यह तब होता है जब सामग्री-प्रकार 'टेक्स्ट/सादे', 'टेक्स्ट/एचटीएमएल', या टेक्स्ट कुछ भी पर सेट होता है। बिल्कुल उसी कोड का उपयोग करना, यदि आप सामग्री-प्रकार को किसी अन्य सामग्री-प्रकार में बदलते हैं, उदा। 'वीडियो/3 जीपीपी', तो यह अपेक्षित और त्रुटि के बिना काम करता है। अपलोड किए जा रहे ऑब्जेक्ट की वास्तविक सामग्री प्रासंगिक नहीं है और त्रुटि प्राप्त करने पर कोई असर नहीं है या नहीं।

मैंने डेल्फी में इंडी कोड के माध्यम से पता लगाया है, लेकिन मुझे लगता है कि टेक्स्ट सामग्री प्रकार हमेशा यह त्रुटि क्यों देता है।

कोई विचार?

उत्तर

4

आप संलग्न हैं "; charset = ISO-8859-1" सामग्री प्रकार स्ट्रिंग के लिए, तो यह काम करता है:

Headers.Values['Content-type']:='text/plain; charset=ISO-8859-1'; 

कोड के माध्यम से कदम मैं सामग्री प्रकार TIdEntityHeaderInfo में बदला जा रहा है देखते हैं .SetHeaders (IdHTTPHeaderInfo.pas) जिसे TIdHTTPProtocol.BuildAndSendRequest (IdHTTP.pas) से कहा जाता है।

आखिरकार, ऐसा लगता है कि समस्या यह है कि TIdEntityHeaderInfo.SetContentType (IdHTTPHeaderInfo.pas) सामग्री प्रकार में एक वर्ण सेट जोड़ रहा है यदि यह 'टेक्स्ट' है और इसमें पहले से कोई नहीं है। यह इन परिस्थितियों में सामग्री प्रकार को नहीं बदला जाना चाहिए क्योंकि सामग्री प्रकार हस्ताक्षर करने के लिए स्ट्रिंग का हिस्सा है, इसलिए हस्ताक्षर के बाद इसे बदलना हस्ताक्षर अमान्य बनाता है।

+0

खुश है कि आप इसे स्वयं ठीक करने में सक्षम थे। टेक्स्ट/एचटीएमएल को पुनः लोड करने का प्रयास करते समय यह वही समस्या है। उस समय मैंने केवल "एचटीएमएल" का सहारा लिया - लेकिन फिर इंटरनेट एक्सप्लोरर को फाइलें देखने में समस्याएं थीं। साझा करने के लिए धन्यवाद !!!!! –

0

मुझे एक ही समस्या थी। मैंने सामग्री प्रकार के रूप में एप्लिकेशन/ऑक्टेट-स्ट्रीम का भी उपयोग किया, लेकिन अभी भी कुछ परेशानी थी। बाद में, मैंने पाया कि बाल्टी नामों को लोअरकेस में होना चाहिए (यूएस मानक क्षेत्र में, अमेज़ॅन अपरकेस या मिश्रित केस नामों के साथ बाल्टी को परिभाषित करने की अनुमति देता है, हालांकि, उन बाल्टी HTTP एपीआई (टीएएमज़ोन स्टोरेज सेवा सहित) के माध्यम से उपलब्ध नहीं हैं। संदेश नहीं मिला, मुझे अभी भी 403 त्रुटि (अनधिकृत उपयोगकर्ता) मिला है। हालांकि, मैंने नाम को सभी लोअरकेस में बदल दिया है, यह ठीक काम करता है। उम्मीद है कि यह

संबंधित मुद्दे