2015-04-10 7 views
-1

Я загружаю файл изображения на Amazon AWS S3 bucket с использованием Java.Как получить URL-адрес файла, загруженного в ведро AWS S3?

Я использую следующие Maven зависимостей -

<dependency> 
     <groupId>com.amazonaws</groupId> 
     <artifactId>aws-java-sdk</artifactId> 
     <version>1.9.28.1</version> 
    </dependency> 

Я могу загрузить файл, а также возможность загружать содержимое. Но я хочу вернуть URL-адрес изображения пользователю.

Как я могу получить URL-адрес изображения сразу после загрузки на ведро s3?

Вот мой Java-код -

public void uploadProfile(InputStream fileInputStream, String fileName) {  

     AmazonS3 s3client = new AmazonS3Client(new BasicAWSCredentials("MY-ACCESS-KEY", "MY-SECRET-KEY")); 
     String bucketName = "MyBucket"; 
     String key = "MyKey"; 

     try { 

      System.out.println("Listing buckets"); 
      for (Bucket bucket : s3client.listBuckets()) { 
       System.out.println(" - " + bucket.getName()); 
      } 
      System.out.println(); 

      System.out.println("Uploading a new object to S3 from a file\n"); 

      s3client.putObject(new PutObjectRequest(bucketName, key, fileInputStream, new ObjectMetadata()).withCannedAcl(CannedAccessControlList.PublicRead)); 

      System.out.println("Downloading an object"); 
      S3Object object = s3client.getObject(new GetObjectRequest(bucketName, key)); 
      System.out.println("Content-Type: " + object.getObjectMetadata().getContentType()); 
      displayTextInputStream(object.getObjectContent()); 

      System.out.println("Listing objects"); 
      ObjectListing objectListing = s3client.listObjects(new ListObjectsRequest() 
        .withBucketName(bucketName) 
        .withPrefix("My")); 
      for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { 
       System.out.println(" - " + objectSummary.getKey() + " " + 
            "(size = " + objectSummary.getSize() + ")"); 
      } 
      System.out.println(); 

     } catch (AmazonServiceException ase) { 
      System.out.println("Error Message: " + ase.getMessage()); 
      ase.printStackTrace();    
     } catch (AmazonClientException ace) { 
      System.out.println("Error Message: " + ace.getMessage()); 
      ace.printStackTrace(); 
     } 
    } 

    private static void displayTextInputStream(InputStream input) throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
     while (true) { 
      String line = reader.readLine(); 
      if (line == null) break; 

      System.out.println(" " + line); 
     } 
     System.out.println(); 
    } 

Я попытался ударить URL: https://MyBucket.s3.amazonaws.com/myfilename

Но его показывая сообщение в формате XML, как -

<Error> 
    <Code>AccessDenied</Code> 
    <Message>Access Denied</Message> 
    <RequestId>64358C14C976A2CB</RequestId> 
    <HostId> 
     ZQ+DAaocOLxR/TmfEMGLcYm4Zk4Kl1vCKjciYiXKF1gYH5Lhj6oM4rd/o/4+SLVb 
    </HostId> 
</Error> 

Так как я могу получить URL изображения сразу после загрузки на ведро s3?

ответ

1

Это ошибка безопасности. Существует хороший шанс, что вы используете хороший URL-адрес, но у вас нет права доступа к файлу. Вам необходимо изменить разрешения для загрузки: все. Тогда файл будет доступен через Интернет для всех. Если вы не хотите этого делать, тогда вы можете настроить различные разрешения, такие как: Аутентифицированные пользователи, затем вы можете получить доступ к файлу из экземпляра EC2 с подключенным пользователем IAM.

+0

Хорошо, поэтому вопрос о разрешении, я буду изучать, но я подумал, что с помощью кодирования я получу URL. – Deepu

0

Необходимо указать конкретный файл в корзине S3 и выбрать опцию: сделать общедоступным. Он будет доступен из любого места.

Смежные вопросы