Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java将Base64编码的图像上载到AmazonS3_Java_Amazon Web Services_Amazon S3 - Fatal编程技术网

使用java将Base64编码的图像上载到AmazonS3

使用java将Base64编码的图像上载到AmazonS3,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,我正在尝试使用Amazon的JavaAPI将文件上传到AmazonS3存储。代码是 Byte[] b = data.getBytes(); InputStream stream = new ByteArrayInputStream(b); //InputStream stream = new FileInputStream(new File("D:/samples/test.txt")); AWSCredentials credentials = new BasicAWSCredentials

我正在尝试使用Amazon的JavaAPI将文件上传到AmazonS3存储。代码是

Byte[] b = data.getBytes();
InputStream stream  = new ByteArrayInputStream(b);
//InputStream stream = new FileInputStream(new File("D:/samples/test.txt"));
AWSCredentials credentials = new BasicAWSCredentials("<key>", "<key1>");
AmazonS3 s3client = new AmazonS3Client(credentials);
s3client.putObject(new PutObjectRequest("myBucket",name,stream, new ObjectMetadata()));
Byte[]b=data.getBytes();
InputStream=新的ByteArrayInputStream(b);
//InputStream=新文件InputStream(新文件(“D:/samples/test.txt”);
AWSCredentials credentials=新的基本WSCredentials(“,”);
AmazonS3 s3client=新的AmazonS3客户端(凭据);
s3client.putObject(新的PutObjectRequest(“myBucket”、名称、流、新的ObjectMetadata());
当我在注释前两行并取消注释第三行之后运行代码时,即
stream
FileoutputStream
,文件已正确上载。但是当
数据
是base64编码字符串(即图像数据)时,会上载文件,但图像已损坏。
Amazon文档说,我需要创建并附加一个POST策略和签名,以使其生效。我如何在java中做到这一点?我没有使用
html
表单进行上传

首先应该删除数据:image/png;base64,从字符串的开头开始:

示例代码块:


下面是一个DTO类,它接收直接从客户端传入的base64Image数据,并将其解析为不同的组件,这些组件可以轻松地在UploadToWSS3方法中传递:

public class Base64ImageDto {

    private byte[] imageBytes;
    private String fileName;
    private String fileType;
    private boolean hasErrors;
    private List<String> errorMessages;
    private static final List<String> VALID_FILE_TYPES = new ArrayList<String>(3);

    static {
        VALID_FILE_TYPES.add("jpg");
        VALID_FILE_TYPES.add("jpeg");
        VALID_FILE_TYPES.add("png");
    }

    public Base64ImageDto(String b64ImageData, String fileName) {
        this.fileName = fileName;
        this.errorMessages = new ArrayList<String>(2);
        String[] base64Components = b64ImageData.split(",");

        if (base64Components.length != 2) {
            this.hasErrors = true;
            this.errorMessages.add("Invalid base64 data: " + b64ImageData);
        }

        if (!this.hasErrors) {
            String base64Data = base64Components[0];
            this.fileType = base64Data.substring(base64Data.indexOf('/') + 1, base64Data.indexOf(';'));

            if (!VALID_FILE_TYPES.contains(fileType)) {
                this.hasErrors = true;
                this.errorMessages.add("Invalid file type: " + fileType);
            }

            if (!this.hasErrors) {
                String base64Image = base64Components[1];
                this.imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image);
            }
        }
    }

    public byte[] getImageBytes() {
        return imageBytes;
    }

    public void setImageBytes(byte[] imageBytes) {
        this.imageBytes = imageBytes;
    }

    public boolean isHasErrors() {
        return hasErrors;
    }

    public void setHasErrors(boolean hasErrors) {
        this.hasErrors = hasErrors;
    }

    public List<String> getErrorMessages() {
        return errorMessages;
    }

    public void setErrorMessages(List<String> errorMessages) {
        this.errorMessages = errorMessages;
    }

    public String getFileType() {
        return fileType;
    }

    public void setFileType(String fileType) {
        this.fileType = fileType;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}

对于使用更高版本SDK的用户: 实施组:
software.amazon.awssdk
,名称:
s3
,版本:
2.10.3

    byte[] bI = Base64.decodeBase64((base64Data.substring(base64Data.indexOf(",") + 1)).getBytes());

    InputStream fis = new ByteArrayInputStream(bI);

    amazonS3Client.putObject(PutObjectRequest.builder().bucket(bucketName).key(fileName)
                    .contentType(contentType)
                    .contentLength(Long.valueOf(bI.length))
                    .build(),
            RequestBody.fromInputStream(fis, Long.valueOf(bI.length)));

如何上传图像(png/jpg)的示例代码如下。-


然而,我没有使用任何编码或解码的概念。这个平面使用了简单的元数据内容类型“image/jpg”

问题真的很好+1问得好,有没有运气弄明白?使用java8,您可以使用内置的util对字符串进行解码:
byte[]bI=java.util.Base64.getDecoder.decode(base64Data)
public void uploadBase64Image(Base64ImageDto base64ImageDto, String pathToFile) {
    InputStream stream = new ByteArrayInputStream(base64ImageDto.getImageBytes());

    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentLength(base64ImageDto.getImageBytes().length);
    metadata.setContentType("image/"+base64ImageDto.getFileType());

    String bucketName = awsS3Configuration.getBucketName();
    String key = pathToFile + base64ImageDto.getFileName();

    try {
        LOGGER.info("Uploading file " + base64ImageDto.getFileName() + " to AWS S3");
        PutObjectRequest objectRequest = new PutObjectRequest(bucketName, key, stream, metadata);
        objectRequest.setCannedAcl(CannedAccessControlList.PublicRead);
        Upload s3FileUpload = s3TransferManager.upload(objectRequest);
        s3FileUpload.waitForCompletion();
    } catch (Exception e) {
        e.printStackTrace();
        LOGGER.info("Error uploading file " + base64ImageDto.getFileName() + " to AWS S3");
    }      
}
    byte[] bI = Base64.decodeBase64((base64Data.substring(base64Data.indexOf(",") + 1)).getBytes());

    InputStream fis = new ByteArrayInputStream(bI);

    amazonS3Client.putObject(PutObjectRequest.builder().bucket(bucketName).key(fileName)
                    .contentType(contentType)
                    .contentLength(Long.valueOf(bI.length))
                    .build(),
            RequestBody.fromInputStream(fis, Long.valueOf(bI.length)));
try {
    BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey);
    AmazonS3 s3Client = 
    AmazonS3ClientBuilder.standard().withRegion(clientRegion)
                    .withCredentials(new 
    AWSStaticCredentialsProvider(awsCreds))
                    .build();
    PutObjectRequest request = new PutObjectRequest(bucketName, fileName, new File(fileToUpload));
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentType("image/jpg");
    request.setMetadata(metadata);
    s3Client.putObject(request.withCannedAcl(CannedAccessControlList.PublicRead));

    logger.info("File " + fileToUpload + " uploaded to AWS bucket " + bucketName);
} catch (AmazonServiceException e) {
    logger.error(e);
    fileName = Common.NO_VALUE.toString();
} catch (SdkClientException e) {
    logger.error(e);
    fileName = Common.NO_VALUE.toString();
}