libs3 S3StatusConnectionFailed

时间:2011-07-22 18:15:35

标签: c amazon-s3

我正在使用此处的libs3库进行文件上传:http://libs3.ischo.com/dox/index.html

虽然我收到了S3StatusConnectionFailed的错误。有人能指出我这种情况会怎样吗?这是我将文件上传到S3的功能。

int putFileIntoS3 (char *fileName, char *s3ObjName) {

S3Status status;
char *key;
struct stat statBuf;
uint64_t fileSize;
FILE *fd;
char *accessKeyId;
char *secretAccessKey;
put_object_callback_data data;

accessKeyId = S3_ACCESS_KEY;
secretAccessKey = S3_SECRET_ACCESS_KEY;


key = (char*) strchr(s3ObjName, '/');
if (key == NULL) {
    printf("S3 Key not defined!!!!");
    return (-1);
}


*key = '\0';
key++;
if (stat(fileName, &statBuf) == -1) {
    printf("Unknown input file");
    return(-1);
}

fileSize = statBuf.st_size;

fd = fopen(fileName, "r");
if (fd == NULL) {
    printf("Unable to open input file");
    return(-1);
}

data.infile = fd;

S3BucketContext bucketContext =
    {s3ObjName, S3ProtocolHTTP, S3UriStylePath, accessKeyId, secretAccessKey}

S3PutObjectHandler putObjectHandler = {
    { &responsePropertiesCallback, &responseCompleteCallback },
    &putObjectDataCallback
};

if ((status = S3_initialize("s3", S3_INIT_ALL)) != S3StatusOK) {
    printf("Failed to initialize libs3: %s\n",S3_get_status_name(status));
    return(-1);
}

S3_put_object(&bucketContext, key, fileSize, NULL, 0, &putObjectHandler, &data);

if (statusG != S3StatusOK) {
    printf("Put failed: %i\n", statusG);
    S3_deinitialize();
    return(-1);
}

S3_deinitialize();

fclose(fd);
return(0);

} 

我回来了“Put failed:46”,我很确定这意味着它是一个S3StatusConnectionFailed错误。

任何帮助都会很棒,甚至可以指向我可以使用的类似boto的库,而不是在C ++中使用的苦差事。

谢谢!

2 个答案:

答案 0 :(得分:0)

在S3_initialize中为第一个参数使用NULL。 S3StatusConnectionFailed表示“s3”url可能错误。我假设您提供了正确的S3_ACCESS_KEY和S3_SECRET_ACCESS_KEY。

答案 1 :(得分:0)

好的,我尝试了非空值,但我得到了相同的错误。我找到了原因:你必须设置" data"的contentLength。 (类型为put_object_callback_data)如下所示

fileSize = statBuf.st_size;
//viren+
data.contentLength = fileSize;
//viren-
//..
data.infile = fd;

哦,还要确保你的存储桶上设置了正确的权限。