我正在使用 AmazonDynamoDBClient putItem 方法在数据库中插入项目。putItem 的返回类型是 PutItemResult 但我将其获取为 null。
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
PutItemRequest r = new PutItemRequest();
r.addItemEntry("custId",new Attribute Value("101"));
PutItemResult result = client.putItem(r);
//result is null
Run Code Online (Sandbox Code Playgroud)
项目已成功插入数据库,但为什么结果为空?
我正在尝试使用 AWS Java Sdk 从 s3 存储桶读取并打印文件的内容。我有一个预先签名的 URL,可让我访问(和下载)该文件。但是,我无法使用预签名 URL 读取该文件。
我想做一些类似于下面的代码片段的事情 -
public void readFromS3(String bucketName, String key) throws IOException {
S3Object s3object = s3.getObject(new GetObjectRequest(bucketName, key));
System.out.println(s3object.getObjectMetadata().getContentType());
System.out.println(s3object.getObjectMetadata().getContentLength());
BufferedReader reader = new BufferedReader(new InputStreamReader(s3object.getObjectContent()));
String line;
while((line = reader.readLine()) != null) {
// can copy the content locally as well
// using a buffered writer
System.out.println(line);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以访问的 URL 可让我下载该文件。
我还查看了以下参考资料,但没有成功 -
http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html
有人可以帮忙吗?
提前致谢!
我已经阅读文档有一段时间了。我可以看到 JavaScript 和 Go SDK 的示例,它们展示了如何通过将AWS_SDK_LOAD_CONFIG环境变量设置为真值来加载配置文件。文档分别位于此处和此处。
但是,根据我的要求,我必须使用Java。我在 Java SDK 中找不到等效的参考。这让我做出三件事假设。
ack -i "AWS_SDK_LOAD_CONFIG"显示两个项目都没有使用此变量。为了清楚起见,我需要加载的配置文件是sbx,它位于我的配置中,但在凭据文件中没有相邻值。这是我的 ~/.aws/config 文件:
[profile shared]
output = json
region = us-west-2
adfs_config.ssl_verification = True
adfs_config.role_arn = ....
adfs_config.adfs_host = ....
adfs_config.adfs_user = ....
[profile sbx]
role_arn = ... (this is different from the adfs_config.role_arn above)
source_profile = shared
region …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Spring Boot Rest API提供存储在S3上的一个PDF.
以下是我的代码:
byte[] targetArray = null;
InputStream is = null;
S3Object object = s3Client
.getObject(new GetObjectRequest("S3_BUCKET_NAME", "prefixUrl"));
InputStream objectData = object.getObjectContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(objectData));
char[] charArray = new char[8 * 1024];
StringBuilder builder = new StringBuilder();
int numCharsRead;
while ((numCharsRead = reader.read(charArray, 0, charArray.length)) != -1) {
builder.append(charArray, 0, numCharsRead);
}
reader.close();
objectData.close();
object.close();
targetArray = builder.toString().getBytes();
is = new ByteArrayInputStream(targetArray);
return ResponseEntity.ok().contentLength(targetArray.length).contentType(MediaType.APPLICATION_PDF)
.cacheControl(CacheControl.noCache()).header("Content-Disposition", "attachment; filename=" + "testing.pdf")
.body(new InputStreamResource(is));
Run Code Online (Sandbox Code Playgroud)
当我使用邮递员点击我的API时,我能够下载PDF文件,但问题是它完全是空白的.可能是什么问题?
S3流数据并不保留缓冲区,数据是二进制(PDF),因此如何使用Rest API将这些数据服务器.
怎么解决这个?
我正在尝试使用 aws-java-sdk-athena 批量执行 AWS Athena 查询。我能够建立连接,单独运行查询,但不知道如何批量运行 3 个查询。任何帮助表示赞赏。
询问
1.select * from table1 limit 2
2.select * from table2 limit 2
3.select * from table3 limit 2
Run Code Online (Sandbox Code Playgroud) batch-processing amazon-web-services aws-java-sdk amazon-athena
如何使用 Java SDK 检查存储桶是否已存在于我的 Aws S3 帐户中?
使用下面的代码
AmazonS3ClientBuilder.defaultClient().doesBucketExistV2(bucketName);
Run Code Online (Sandbox Code Playgroud)
检查存储桶的全局存在,如果具有此名称的存储桶全局存在,即使我不是此存储桶的所有者或我无权访问该存储桶,也返回 true。
我理解以这种方式制作此方法的意图,以便它允许我们确定存储桶名称的可用性,但这不是我所需要的。当然,它会抛出异常,我以后无法访问它,但它会返回声明具有此名称的存储桶存在。
我想检查我的 S3 帐户中是否存在具有给定名称的存储桶,以便我可以对其执行操作。
一种可能的解决方案可以是list所有存储桶并在返回的列表中搜索我的存储桶,我觉得这在性能方面不是很好(如果我错了,请纠正我),因为可能有成千上万的存储桶并在其中搜索他们效率不高。
如何在不检查全局存在的情况下确定存储桶是否存在于我的 S3 帐户中?
我有这样的结构:
common/test/v20170522/part-0001.snappy
common/test/v20170522/part-0002.snappy
common/test/v20170522/part-0003.snappy
common/test/v20170522/part-0004.snappy
common/test/v20170622/part-0001.snappy
common/test/v20170622/part-0002.snappy
common/test/v20170622/part-0003.snappy
common/test/v20170622/part-0004.snappy
Run Code Online (Sandbox Code Playgroud)
还有更多版本文件夹,其中有更多文件。我基本上想要文件夹中所有文件夹的列表test/common: so v20170522, v20170622, etc。
这是我到目前为止所拥有的:
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.setBucketName("common");
listObjectsRequest.setPrefix("test/");
listObjectsRequest.setDelimiter("/");
Run Code Online (Sandbox Code Playgroud)
这只会返回common/test文件夹中的文件,而不是文件夹。当我删除分隔符时,我得到所有文件夹的所有子文件。有办法做到这一点吗?
我正在尝试使用 Java 中 KCL 库的新功能来实现 AWS Kinesis 的正常关闭,方法是注册关闭钩子以停止所有记录处理器,然后正常停止工作进程。新库提供了记录处理器需要实现的新接口。但它是如何被调用的呢?
尝试先调用worker.requestShutdown(),然后调用worker.shutdown(),它起作用了。但这是使用它的任何预期方式吗?那么两者都有什么用,有什么好处呢?
我正在尝试使用 Cognito 对 Java 应用程序进行身份验证。我在 python 中使用了运行良好的保证库。但我现在想在java中做同样的事情。
我用我的 Python 函数对保证库进行身份验证
def SRPauthentication(organizationAdmin,
password,
pool_id,
client_id,
client):
aws = AWSSRP(username=organizationAdmin,
password=password,
pool_id=pool_id,
client_id=client_id,
client=client)
tokens = aws.authenticate_user()
authorization_token= tokens['AuthenticationResult']['IdToken']
return authorization_token
Run Code Online (Sandbox Code Playgroud)
有了这个,我可以轻松访问一些安全的 API。现在我想用 Java 做同样的事情,但我有问题。
到目前为止,这是我的解决方案是这种方法:
public static void GetCreds()
{
AWSCognitoIdentityProvider identityProvider = AWSCognitoIdentityProviderClientBuilder.defaultClient();
AdminInitiateAuthRequest adminInitiateAuthRequest = new AdminInitiateAuthRequest().
withAuthFlow(AuthFlowType.USER_SRP_AUTH).
withClientId("234234234234").withUserPoolId("eu-central-1_sdfsdfdsf")
.addAuthParametersEntry("USERNAME", "UserK").
addAuthParametersEntry("PASSWORD","#######);
adminInitiateAuthRequest.getAuthFlow();
AdminInitiateAuthResult adminInitiateAuth = identityProvider.adminInitiateAuth(adminInitiateAuthRequest);
System.out.println(adminInitiateAuth.getAuthenticationResult().getIdToken());
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到一个异常:
Exception in thread "main" `com.amazonaws.services.cognitoidp.model.AWSCognitoIdentityProviderException: User: arn:aws:iam::XXXXXXXXXXXXXXXXX:user/khan is not authorized to perform: cognito-idp:AdminInitiateAuth on resource: arn:aws:cognito-idp:eu-central-1:XXXXXXXX:userpool/eu-central-1_XXXXXXX …Run Code Online (Sandbox Code Playgroud) java amazon-web-services srp-protocol amazon-cognito aws-java-sdk
我正在开发一个 Spring Boot 应用程序,它应该允许用户通过指定的应用程序 REST 接口间接从 Amazon S3 下载文件。为此,我有一个 REST-Controller,它向用户返回一个 InputStreamResource,如下所示:
@GetMapping(path = "/download/{fileId}")
public ResponseEntity<InputStreamResource> downloadFileById(@PathVariable("fileId") Integer fileId) {
Optional<LocalizedFile> fileForDownload = fileService.getConcreteFileForDownload(fileId);
if (!fileForDownload.isPresent()) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileForDownload.get().getFilename())
.body(new InputStreamResource(fileService.download(fileForDownload.get())));
}
Run Code Online (Sandbox Code Playgroud)
文件服务中的下载方法如下:
@Override
public InputStream download(LocalizedFile file) {
S3Object obj = s3client.getObject(bucketName, file.getFilename());
return obj.getObjectContent();
}
Run Code Online (Sandbox Code Playgroud)
我担心的是,来自 Amazon SDK 的输入流无法在控制器中显式关闭。getObjectContent() 方法的 AWS 文档中有以下警告,这让我对上述方法是否成功表示怀疑:
如果您检索 S3Object,则应尽快关闭此输入流,因为对象内容不会在内存中缓冲并直接从 Amazon S3 进行流式传输。此外,未能关闭此流可能会导致请求池被阻塞。
因此我的问题是:返回ResponseEntity<InputStreamResource>控制器是否安全?下载成功后这个InputStream会S3Object.getObjectContent()自动关闭吗?到目前为止,我的方法很成功,但我不太确定未来可能产生的后果。