Отображение изображения, сохраненного в amazon s3, в веб-браузере с использованием сервлета - PullRequest
2 голосов
/ 14 января 2011

Я сохранил свои изображения в S3.

Что у меня есть -

Входной поток, содержащий изображение.

Что я хочу?

Разработка сервлета, который может конвертировать этот поток ввода в изображение.

Пожалуйста, помогите. Я новичок во всем этом.

Ответы [ 3 ]

4 голосов
/ 14 января 2011

Самое простое, что нужно сделать - это использовать URL-адреса S3 напрямую.

Для публичных файлов они имеют формат:

http://s3.amazonaws.com/[bucket]/[key]

Но, как указывает @T.J. в своем ответе, эти изображения будут видны снаружи.

Однако вы можете сделать свой контент личным , чтобы он не был доступен по стандартному URL и только через подписанный URL с истекающим сроком . Java AWS SDK упростит их создание.

3 голосов
/ 14 января 2011

Ваш сервлет получит параметр response, который является экземпляром ServletResponse, который имеет метод getOutputStream.Используйте setContentType, чтобы установить тип содержимого ответа в соответствии с данными изображения, используйте getOutputStream, чтобы получить выходной поток, а затем выполните цикл, считывая из вашего входного потока и записывая в ваш выходной поток.

В качестве альтернативы, если это подходит для того, что вы делаете (и может, а может и нет), вы можете иметь тег img в своем HTML, указывающий прямо на изображение в s3 и избегать его потоковой передачи через сервер.полностью.Но, конечно, это работает, только если у вас все в порядке с внешне достижимым изображением.Если вы ищете «s3 serve image», вы найдете различные статьи (в том числе написанные Джеффом Этвудом из SO) об этом, я не буду случайным образом выбирать одну для ссылки здесь.

0 голосов
/ 17 мая 2019

В HTML

<img src='setImageFromS?path=sample/file&fileName=image.jpg'>

В сервлете

public void setImageFromS3(HttpServletRequest request, HttpServletResponse response) {
    File tmp = null;
    try {
        // create a client connection based on credentials
        AmazonS3 s3client = new AmazonS3Client(getAWSCredentials());

        String bucketName = getS3BucketName();
        String fileName = "";
        // upload file to folder and set it to public
        fileName = request.getParameter("path") +"/" + request.getParameter("fileName");
        S3Object o = s3client.getObject(bucketName, fileName);
        S3ObjectInputStream s3is = o.getObjectContent();
        tmp = File.createTempFile("s3test", ".jpeg");
        Files.copy(s3is, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING);
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();

        try {
          BufferedImage image = ImageIO.read(tmp);
          ImageIO.write(image, "jpeg", jpegOutputStream);
        } catch (IllegalArgumentException e) {
          response.sendError(HttpServletResponse.SC_NOT_FOUND);
        }
        tmp.delete();
        byte[] imgByte = jpegOutputStream.toByteArray();

        response.setHeader("Cache-Control", "no-store");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/jpeg");
        ServletOutputStream responseOutputStream = response.getOutputStream();
        responseOutputStream.write(imgByte);
        responseOutputStream.flush();
        responseOutputStream.close();

    } catch (IOException ex) {
        Logger.getLogger(AmazonS3DaoImpl.class.getName()).log(Level.SEVERE, null, ex);
    }
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...