- A имя файла не является изображением. Это просто текст, который идентифицирует файл.
- Содержимое файла представляет собой последовательность байтов, которая полностью отделена от имени. Это фактические данные изображения.
Отправка имени файла в ответе не отправит содержимое.
Существует два распространенных способа отправки нескольких изображений в ответ HTTP:
- Отправка архива, содержащего несколько файлов, например ZIP-файл.
- Отправка ответа с типом содержимого
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 являются одним из таких вариантов.