MessageBodyReader — Как получить несколько файловJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 MessageBodyReader — Как получить несколько файлов

Сообщение Anonymous »

У меня есть MessageBody для чтения PDF-файлов. При выполнении multipart-formdata в Insomnia при передаче двух PDF-файлов я получаю только один. Цель состоит в том, чтобы получить несколько файлов в Multipart-formdata, и каждый файл должен быть индексом массива InputStream[], чтобы я мог объединить их все и, таким образом, вернуть один файл. Но я не могу получить больше 1 файла (первый из запроса).

Код: Выделить всё

import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Arrays;

@Provider
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public class MessagePdfBodyReader implements MessageBodyReader {

@Override
public boolean isReadable( Class type, Type genericType, Annotation[] annotations, MediaType mediaType ) {
return mediaType.isCompatible( MediaType.valueOf( "application/pdf" ) );
}

@Override
public InputStream[] readFrom( Class aClass, Type type, Annotation[] annotations, MediaType mediaType, MultivaluedMap multivaluedMap, InputStream inputStream ) throws IOException, WebApplicationException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
byte[] pdfBytes = output.toByteArray();

return new InputStream[] { new ByteArrayInputStream(pdfBytes) };
}
}
Класс для объединения PDF-файлов:

Код: Выделить всё

public class MergePdfService {

public byte[] executeService( InputStream[] pdffiles ) throws IOException, DocumentException {

return mergePdfs( pdffiles );
}

private byte[] mergePdfs(InputStream[] pdfFiles) throws IOException {
PDFMergerUtility merger = new PDFMergerUtility();
PDDocument merged = new PDDocument();

for (InputStream pdfFile : pdfFiles) {
File tempFile = File.createTempFile("temp", ".pdf");
try (FileOutputStream fos = new FileOutputStream(tempFile)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = pdfFile.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
}

try (PDDocument doc = Loader.loadPDF(tempFile)) {
merger.appendDocument(merged, doc);
} finally {
tempFile.delete();
System.out.println("Arquivo temporário deletado com sucesso!");
}
}

try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
merged.save( baos );
System.out.println(pdfFiles.length);
return baos.toByteArray();
}
}
}

Как сериализовать: "форма @MultipartForm MergePdfModel"
Я использую этот импорт:
org .jboss.resteasy.annotations.providers.multipart.MultipartForm;
Класс MergePdfModel:

Код: Выделить всё

import org.jboss.resteasy.annotations.providers.multipart.PartType;

import javax.ws.rs.FormParam;
import javax.ws.rs.core.MediaType;
import java.io.InputStream;
import java.util.List;

public class MergePdfModel {

@FormParam("pdfFiles")
@PartType(MediaType.MULTIPART_FORM_DATA)
private InputStream[] pdfFiles;

@FormParam("pdfName")
@PartType(MediaType.TEXT_PLAIN)
private String pdfName;

public void setPdfName( String pdfName ) {
this.pdfName = pdfName;
}

public String getPdfName() {
return pdfName;
}

public InputStream[] getPdfFiles() {
return pdfFiles;
}

public void setPdfFiles( InputStream[] pdfFiles ) {
this.pdfFiles = pdfFiles;
}
}
Это мой первый пост здесь, пожалуйста, будьте терпеливы.
Я пытаюсь получить несколько PDF-файлов в запросе с помощью MessageBodyReader, объедините их все в один файл и верните его.

Подробнее здесь: https://stackoverflow.com/questions/785 ... ples-files
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»