Установка нескольких изображений для объекта ответа - PullRequest
0 голосов
/ 17 февраля 2020

Я хочу вернуть ответ с несколькими изображениями клиенту. И на стороне клиента я хочу скачать эти изображения. Я не нашел никакого метода, как .setEntity () для HttpServletResponse. Поэтому я решил добавить изображения в поля заголовка. Я добавляю следующим образом:

File sourceFile = new File(serverLocation + "/" + filename);

servletresponse.setContentType(new MimetypesFileTypeMap().getContentType(sourceFile));
servletresponse.setContentLength((int)sourceFile.length());
servletresponse.setHeader(filename, "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));

Я не могу загрузить на стороне клиента. Это то, что я делаю на стороне клиента,

CloseableHttpResponse response = httpclient.execute(httppost);
Header[] headers = response.getAllHeaders();
            for (int i = 0; i < headers.length; i++) {
                if (headers[i].getName().equals(filename)) {
                    imagename = headers[i].getValue();
                }
            }
InputStream fileInputStream = new ByteArrayInputStream(imagename.getBytes(StandardCharsets.UTF_8));
            byte[] bufffer = new byte[512];
            while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
                fileOutputStream.write(bufffer, 0, bufferSize);
            }

Однако это не написание изображений. Как я могу добавить несколько файлов и загрузить его на стороне клиента. Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020
  • A имя файла не является изображением. Это просто текст, который идентифицирует файл.
  • Содержимое файла представляет собой последовательность байтов, которая полностью отделена от имени. Это фактические данные изображения.

Отправка имени файла в ответе не отправит содержимое.

Существует два распространенных способа отправки нескольких изображений в ответ HTTP:

  1. Отправка архива, содержащего несколько файлов, например ZIP-файл.
  2. Отправка ответа с типом содержимого multipart/mixed, как описано в RF C 2046 . Вы можете сделать это вручную, но классы пакета javax.mail.inte rnet делают это намного проще.

Оба подхода требуют, чтобы изображения находились в тело ответа, не в заголовках. Заголовки предназначены только для (относительно) коротких строк, а имена заголовков имеют ограничения на то, какие символы они могут содержать.

Подход на основе zip-файла проще всего кодировать:

String[] filenames = { /* ... */ };

servletresponse.setContentType("application/zip");

try (ZipOutputStream zip = new ZipOutputStream(
    servletresponse.getOutputStream())) {

    for (String filename : filenames) {
        ZipEntry entry = new ZipEntry(filename);
        zip.putNextEntry(entry);
        Files.copy(Paths.get(filename), zip);
    }
}

Второй Для этого подхода требуется API JavaMail и API Java Activation Framework. Если вы используете настоящий сервер Java EE, такой как GlassFi sh или JBoss, у вас уже есть доступ к ним, поскольку JavaMail и JAF являются компонентами, требуемыми спецификацией Java EE.

String[] filenames = { /* ... */ };

MimeMultipart multipart = new MimeMultipart("mixed");

for (String filename : filenames) {
    MimeBodyPart part = new MimeBodyPart();
    part.attachFile(filename, null, "base64");
    multipart.addBodyPart(part);
}

Properties props = new Properties();
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
message.setContent(multipart);
message.saveChanges();

servletresponse.setContentType(multipart.getContentType());
try (OutputStream out = servletresponse.getOutputStream()) {
    multipart.writeTo(out);
}

Каждый подход потребует различной обработки на стороне клиента. Клиент может просто сохранить zip-архив напрямую:

String home = System.getProperty("user.home");

try (InputStream content = response.getEntity().getContent()) {
    Files.copy(content, Paths.get(home, "Downloads", "images.zip"));
}

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

Для составного ответа потребуется API, способный читать составное сообщение MIME. JavaMail и JAF являются одним из таких вариантов.

0 голосов
/ 17 февраля 2020

Один HTTP-вызов может вернуть только одно изображение (контент). Если вам нужно отправить несколько изображений, вы можете:

  1. Передать URL-адреса изображения в ответ вместо фактического ресурса и выполнить синтаксический анализ клиента и загрузить их
  2. Если вы хотите скрыть В ответе от тела вы можете использовать заголовки для той же цели, что и в примере (но для меня это выглядит странно)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...