LINUX.ORG.RU

Правильная отдача svg для использования в качестве картинки в img

 , , ,


0

1

Хочу картинки отдавать в svg. Но в беке организовал безличную отдачу файлового контента так:


@GetMapping(value = "/{fileName:.+}", produces = APPLICATION_OCTET_STREAM_VALUE)
    @ExceptionHandler(value = FileNotFoundException.class)
    public @ResponseBody
    HttpEntity<byte[]> getFileById(@PathVariable String fileName, final HttpServletResponse response) throws IOException {

        StoredFile file = this.storageService.getFileByName(fileName);
        if (file == null) {
            response.sendError(404, String.format("File %s not found", fileName));
            return null;
        }
        byte[] content;
        try {
            content = this.storageService.getFileContent(file.getPath());
        } catch (IOException e) {
            e.printStackTrace();
            if (this.userService.isCurrentUserAdmin()) {
                response.sendError(404, String.format("File %s (%s) not found", file.getName(), file.getPath()));
            } else {
                response.sendError(404, String.format("File %s not found", file.getName()));
            }
            return null;
        }

        HttpHeaders header = new HttpHeaders();
        header.setContentType(APPLICATION_OCTET_STREAM);
        header.set("Content-Disposition", "inline; filename=" + file.getName());
        header.setContentLength(file.getSize());

        return new HttpEntity<byte[]>(content, header);
    }

Когда вставляю ссыль на картинку, которую загрузил предварительно, так


<img class="skill-icon" src="/files/123" alt="Postgresql">

то она не показывается в виде картинки от слова совсем.

Если я вставляю содержимое файла svg как html, то все ок.

Как быть? Поможет ли явное указание типа контента при отдаче файла?

★★★★★

Ты неправильный mime тип отдаешь («application/octet-stream»)

Надо produces = APPLICATION_OCTET_STREAM_VALUE заменить на другой тип. Если у тебя там не только svg-шки, то тип надо определять динамически и выставлять его в HttpHeaders header = new HttpHeaders(); header.setContentType(APPLICATION_OCTET_STREAM);

P.S. Вообще говоря не понял, зачем тебе content-disposition... без него должно нормально работать имхо.

Qasta
()
Ответ на: комментарий от Qasta

про Content-Disposition я где-то в инете стырил особо не вдумываясь.

Про майм-тип - да, я как раз и имел в виду, что его нужно для каждого типа файла задавать свой. Странно, что другие png/jpg-шки нормально воспринимаются браузером, а с svg - засада

bvn13 ★★★★★
() автор топика

Правильный mime type это image/svg+xml
И расширение надо указывать явно:

<img class="skill-icon" src="/files/123.svg" alt="Postgresql">

uin ★★★
()
Ответ на: комментарий от bvn13

у бинарных форматов бинарный заголовок а текст труднее распознать «картинкой». хз что там за xml и кк его отоборажать. может это имеется ввиду шаблон или дома кусок или пример кода для старницы, счего браухзеру знать что его надо рендерить вектором лол

anonymous
()
Ответ на: комментарий от bvn13

Проверь есть ли заголовок в начале svg <?xml version="1.0" encoding="UTF-8"?>

uin ★★★
()
Ответ на: комментарий от bvn13

Я сделал универсальное файлохранилище

Файловый сервер должен раздавать файлы с правильными типами. Пример хорошего решения: https://nginx.ru/ru/docs/http/ngx_http_core_module.html#types

Кстати имеет смысл раздавать файлы не из жабы, nginx умеет не только вешать content-type, но и использовать штуки вроде sendfile и aio для максимально эффективной раздачи

annulen ★★★★★
()
Ответ на: комментарий от annulen

нет жабоинженерам виджнее как надо жить, нжининикс это не жаба: не универсально и нет ооп,

anonymous
()
Ответ на: комментарий от anonymous

В дев-среде лучше запускать одно приложение (Java), чем два (Java+ngingx). Оглянуться не успеешь, будет уже и два, и три, и 100500, на чистую установку станет уходить день-другой.

Подключить nginx на продакшене это никак не мешает.

anonymous
()
Ответ на: комментарий от anonymous

А кто говорил, что приложение без nginx не должно раздавать файлы правильно? Я имел в виду, что для абстрактной файлопомойки нужна конфигрурируемость, как в nginx, или хотя бы набор дефолтных правил, как в nginx

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.