Мне нужен 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"
Может ли кто-нибудь помочь мне исправить это?
В дополнение к ответу, предоставленному 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...
Надеюсь это поможет!
Вам придется отображать параметрическую строку 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);