Я использую curl для вызова API Java ReST для получения URL-адреса. Затем Java генерирует предварительно подписанный URL-адрес для загрузки S3 с использованием моих учетных данных S3 и возвращает это в ответ ReST. Curl берет URL-адрес и использует его для загрузки на S3, но S3 возвращает 403 "Подписанная вами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи".
Вот код, который я использую для создания предварительно подписанного URL:
public class S3Util {
static final AmazonS3 s3 = new AmazonS3Client( new AWSCredentials() {
@Override
public String getAWSAccessKeyId() {
return "XXXXXXX";
}
@Override
public String getAWSSecretKey() {
return "XXXXXXXXXXXXXX";
}
});
static final String BUCKET = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";
static public URL getMediaChunkURL( MediaChunk mc, HttpMethod method ) {
String key = ...
//way in the future (for testing)...
Date expiration = new Date( System.currentTimeMillis() + CalendarUtil.ONE_MINUTE_IN_MILLISECONDS*60*1000 );
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(BUCKET, key, method);
req.setExpiration(expiration);
req.addRequestParameter("Content-Type", "application/octet-stream");
//this gets passed to the end user:
return s3.generatePresignedUrl(req);
}
}
и в curl, запустите от bash, я выполняю это:
echo Will try to upload chunk to ${location}
curl -i -X POST \
-F 'Content-Type=application/octet-stream' \
-F "[email protected]${fileName}" \
${location} || (echo upload chunk failed. ; exit 1 )
Помимо прочего, я попробовал PUT, и я попробовал "Content-type" (нижний регистр T). Я понимаю, что я что-то пропустил (или что-то подобное), но после прочтения соответствующих документов, поиска в Google и просмотра многих подобных вопросов, я не уверен, что это такое. Я вижу много подсказок о необходимых заголовках, но я думал, что отложенный URL должен был устранить эти потребности. Может быть, нет?
ТИА!
Update:
Просто, чтобы быть ясным, я тестировал загрузки, и это работает нормально.
Java выглядит так:
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(BUCKET, key, HttpMethod.GET);
req.setExpiration(expiration);
и curl просто:
curl -i ${location}