2012-04-26 14 views
6

kullanarak '/ * metin': Hep UploadObject çağrısının bir hata alırSignatureDoesNotMatch hatası aşağıdaki Delphi XE2 (güncelleme 4) kodu kullanarak 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); 

:

Başarısız: HTTP/1.1 403 Yasaklandı - hesapladığımız istek imzası, verdiğiniz imzayla eşleşmiyor. Anahtarınızı kontrol edin ve yöntemini imzalayın. (SignatureDoesNotMatch)

Bu, yalnızca İçerik türü 'text/plain', 'text/html' veya herhangi bir metin olarak ayarlandığında gerçekleşir. Tam olarak aynı kodu kullanarak, içerik türünü yalnızca başka bir içerik türüne değiştirirseniz, ör. 'video/3gpp', sonra beklendiği gibi ve hatasız çalışır. Yüklenen nesnenin gerçek içeriği uygun değildir ve hatayı almayla ilgili bir dayanağı yoktur.

Delphi'de Hintçe kodundan izledim, ancak metin içeriği türünün neden her zaman bu hatayı verdiğini anladım.

Herhangi bir fikrin var mı?

cevap

4

ekleyin.Yani "Eğer; charset = ISO-8859-1" Content-Type dizeye, o zaman çalışır: kodu ile Stepping

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

Ben Content-Type TIdEntityHeaderInfo değişti ediliyor bakınız .SetHeaders (IdHTTPHeaderInfo.pas) TIdHTTPProtocol.BuildAndSendRequest (IdHTTP.pas) denir.

Sonuç olarak, TIdEntityHeaderInfo.SetContentType (IdHTTPHeaderInfo.pas) öğesi, 'text' ise ve zaten bir tane içermiyorsa, içerik türüne ayarlanmış bir karakter eklemekte olduğu gibi görünüyor. İçerik türü bu durumlarda değiştirilmemelidir çünkü içerik türü imzalanacak dizenin bir parçasıdır, bu yüzden imzalamadan sonra imzalamak imzayı geçersiz kılar.

+0

Kendinizi düzeltmek için sevindim sevindim. metin/html updload çalışırken bu tam olarak aynı sorun.O anda sadece "html" başvurdu - ama sonra Internet Explorer dosyaları görüntüleme sorunları vardı. –

0

Aynı problem vardı. Ayrıca, uygulama/octet-stream'i içerik türü olarak kullandım, ancak yine de bazı sıkıntılarım vardı. Daha sonra, kova adlarının küçük harflerle olması gerektiğini keşfettim (ABD Standart Bölgesi'nde Amazon, Büyük harfli veya karışık büyük harfli isimleri tanımlamaya izin verir, ancak bu paketlere HTTP API'sinden erişilemez (TAmazonStorageService dahil). ileti bulunamadı, hala 403 hatası (kimliği doğrulanmamış kullanıcı) var. Ancak, ben tüm küçük harf için adını değiştirdim, bu iyi çalıştı Umut yardımcı olur