Amazon AWS S3 上传文件 并获取公用url
程序员文章站
2022-07-12 18:32:42
...
最近在用aws的s3做云存储,把文件上传上去,在数据库中记录对应的url,下面是示例代码:
public static String uploadToS3(File tempFile, String remoteFileName) throws IOException { PropertiesUtil propertiesUtil = new PropertiesUtil("s3.properties"); //首先创建一个s3的客户端操作对象(需要amazon提供的密钥) AmazonS3 s3 = new AmazonS3Client( new BasicAWSCredentials(propertiesUtil.getKeyValue(Consts.S3_ACCESS_KEY), propertiesUtil.getKeyValue(Consts.S3_SCERET_KEY))); Region usWest2 = Region.getRegion(Regions.US_WEST_2); s3.setRegion(usWest2); //设置bucket,key String bucketName = Consts.S3_BUCKET_NAME; String key = UUID.randomUUID() + ".apk"; try { //验证名称为bucketName的bucket是否存在,不存在则创建 if (!checkBucketExists(s3, bucketName)) { s3.createBucket(bucketName); } //上传文件 s3.putObject(new PutObjectRequest(bucketName, key, tempFile)); S3Object object = s3.getObject(new GetObjectRequest(bucketName, key)); //获取一个request GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest( bucketName, key); Date expirationDate = null; try { expirationDate = new SimpleDateFormat("yyyy-MM-dd").parse("2020-12-31"); } catch (Exception e) { e.printStackTrace(); } //设置过期时间 urlRequest.setExpiration(expirationDate); //生成公用的url URL url = s3.generatePresignedUrl(urlRequest); System.out.println("=========URL=================" + url + "============URL============="); if (url == null) { throw new OperateFailureException("can't get s3 file url!"); } return url.toString(); } catch (AmazonServiceException ase) { ase.printStackTrace(); logger.info("====================================AWS S3 UPLOAD ERROR START======================================"); logger.info("Caught an AmazonServiceException, which means your request made it " + "to Amazon S3, but was rejected with an error response for some reason."); logger.info("Caught an AmazonServiceException, which means your request made it " + "to Amazon S3, but was rejected with an error response for some reason."); logger.info("Error Message: " + ase.getMessage()); logger.info("HTTP Status Code: " + ase.getStatusCode()); logger.info("AWS Error Code: " + ase.getErrorCode()); logger.info("Error Type: " + ase.getErrorType()); logger.info("Request ID: " + ase.getRequestId()); logger.info(ase.getMessage(), ase); logger.info("====================================AWS S3 UPLOAD ERROR END======================================"); throw new OperateFailureException("error occurs during upload to s3!"); } catch (AmazonClientException ace) { logger.info("====================================AWS S3 UPLOAD ERROR START======================================"); logger.info("Caught an AmazonClientException, which means the client encountered " + "a serious internal problem while trying to communicate with S3, " + "such as not being able to access the network."); logger.info("Error Message: " + ace.getMessage()); logger.info("====================================AWS S3 UPLOAD ERROR END======================================"); throw new OperateFailureException("error occurs during upload to s3!"); } } /** * 验证s3上是否存在名称为bucketName的Bucket * @param s3 * @param bucketName * @return */ public static boolean checkBucketExists (AmazonS3 s3, String bucketName) { List<Bucket> buckets = s3.listBuckets(); for (Bucket bucket : buckets) { if (Objects.equals(bucket.getName(), bucketName)) { return true; } } return false; }
上面的代码只是一部分,整个过程是在jsp页面吧文件上传到后台,后台创建一个临时文件,把临时文件上传到s3上,并获取一个可以下载文件的url;
这里是一个英文的参考:http://ceph.com/docs/master/radosgw/s3/java/