Java - получить PDF-файл из URL-адреса и вернуть строку BASE64
У меня есть следующая задача: получить PDF-файл по URL-адресу и вернуть строку BASE64.
Что у меня есть сейчас (извините, я не эксперт по Java):
public String readPDFSOAP(String var, Container container) throws StreamTransformationException{
try {
//get the url page from the arguments array
URL url = new URL("URLPDF");
try {
//get input Stream from URL
InputStream in = new BufferedInputStream(url.openStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[131072];
int n = 0;
while (-1 != (n = in.read(buf))) {
out.write(buf, 0, n);
}
out.close();
in.close();
byte[] response = out.toByteArray();
String string = new String(response);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}return String;}
Но строка не может быть возвращена. Любая помощь приветствуется.
Спасибо, Джулиан
2 ответа
Ваш код ошибочен. Для начала используйте класс Base64 для обработки кодирования вашего байтового массива. И не нужно назначать его переменной, просто верните.
return Base64.getEncoder().encodeToString(response)
и в вашей последней строке, за пределами вашего блока try/catch, просто вызовите исключение. Если вы попали туда, значит, вы не смогли правильно получить и закодировать ответ, поэтому возвращать значение не нужно. Вы в состоянии ошибки.
Используйте java.util.Base64.
PDF-файлы могут быть довольно большими. Вместо того, чтобы считывать его в память, напрямую закодируйте InputStream:
ByteArrayOutputStream out = new ByteArrayOutputStream();
try (InputStream in = new BufferedInputStream(url.openStream())) {
in.transferTo(Base64.getEncoder().wrap(out));
}
String base64 = out.toString(StandardCharsets.US_ASCII);
Версия в кодировке Base64 даже больше, чем исходный файл. Я не знаю, что вы планируете делать с закодированной версией, но если вы планируете где-то ее записать, вам следует избегать хранения любой версии файла - исходной или закодированной - в памяти. Вы можете сделать это, если ваш метод принимает OutputStream в качестве аргумента:
public void readPDFSOAP(OutputStream destination,
String var,
Container container)
throws StreamTransformationException,
IOException {
URL url = new URL("https://example.com/doc.pdf");
try (InputStream in = new BufferedInputStream(url.openStream())) {
in.transferTo(Base64.getEncoder().wrap(destination));
}
}
Обновлять:
Поскольку вы сказали, что не можете использовать оператор try-with-resources:
Примерочных с-ресурсы оператор просто удобный способ гарантировать InputStream (или другой закрываемый ресурс) закрыт. Этот:
try (InputStream in = new BufferedInputStream(url.openStream())) {
// code that uses 'in'
}
(почти) эквивалентно этому:
InputStream in = null;
try {
in = new BufferedInputStream(url.openStream());
// code that uses 'in'
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// Suppress
}
}
}