Как я могу написать Java-код на стороне сервера для возврата любого вида файла в виде потока, используя JAX-RS (Джерси)?

1

Мне нужен Java- код, который должен возвращать любой файл в виде потока, используя JAX-RS (Джерси). на стороне клиента.

У меня есть следующий код,

@GET
@Path("/{name}")
@Produces("*/*")
public Response getFile(String name) {
    File file = new File("/path/of/the/file");
        FileInputStream fiS = new FileInputStream(file);
        StreamingOutput st = new StreamingOutput() {
            @Override
            public void write(OutputStream os) throws IOException {
                try {
                    int n;
                    byte[] buffer = new byte[1024];
                    while ((n = fis.read(buffer)) >= 0) {
                    os.write(buffer, 0, n);   
                   }
                   os.close();
                } catch (Exception e) {
                    throw new WebApplicationException(e);
                }
            }
        };
        ResponseBuilder response = Response.ok(st);
        response.header("Content-Type", "*/*");
    response.header("Content-Disposition", "inline; filename=" + fileName);
        return response.build();
}

Но он работает только для .txt,.html,.properties and.rtf. Поскольку я могу загрузить и получить фактическое содержимое файлов на стороне клиента для этих типов файлов.

Но не sworking для файлов с расширением .doc,.pdf,.png,.PNG,.jpeg,.mp3,.mp4..etc.

Но мне нужен общий код, который должен возвращать любые файлы.

Получение результата при возврате изображения. Image.PNG Пробовал content-type "image/png" Изображение 174551

Может ли кто-нибудь помочь мне исправить это?

Теги:
rest
file-io
jax-rs
jersey

2 ответа

0

В дополнение к ответу, предоставленному robermann, способ узнать тип Mime-двоичного файла для отправки клиенту можно обнаружить с помощью Apache Ticka

byte[] bs = ....
final String contentType = new Tika()
         .detect(new BufferedInputStream(new ByteteArrayInputStream(bs)));
MimeTypes allTypes = MimeTypes.getDefaultMimeTypes();
MimeType mimeType = allTypes.forName(contentType);

Теперь вы можете получить доступ к объекту MimeType и отправить его тип в заголовок.

Пример: Чтобы узнать расширение файла байта [], просто добавьте в код выше:

mimeType.getExtension()

Это вернет:.pdf,.xml,.txt...

Надеюсь это поможет!

0

Вам придется отображать параметрическую строку response.header("Content-Type", mimeType), устанавливая для каждого ответа подходящий тип контента. Вы можете обработать его как карту "файл расширения" → "mime-type", что-то вроде следующего:

    //init in a run-once method (static, singleton, etc)
    final Hashtable<String, String> allowedTypes = new Hashtable<String, String>();
    allowedTypes .put("xls", "x-msexcel");
    allowedTypes .put("xlsx", "application/vnd.ms-excel.12");
    allowedTypes .put("mp3", "audio/mpeg3");
    allowedTypes .put("doc", "application/msword");
    //and so on, in a sort of white-list of allowed types

    //use the map
    final String default = "text/plain";
    String extension = getExtension(file); //not of interest here
    String curType = allowedTypes.get(extension)!= null ? allowedTypes.get(extension) : default;

    response.header("Content-Type", curType);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню