Почему браузер напрямую просматривает и открывает некоторые изображения, а некоторые напрямую загружает? ——Причина кроется в заголовке ответа Content-Type;
Роль заголовка ответа Content-Type: Content-Type Используется для описания типа носителя ресурса передачи получателю, чтобы браузер мог использовать указанную кодовую таблицу для его декодирования.
Из-за ограничений браузера при загрузке файла и установке заголовка application/octet-stream браузер по умолчанию загрузит ссылку вместо загрузки файла в браузере. Поэтому, если вы хотите открыть файл напрямую, загрузите его. Не устанавливайте application/octet-stream.
Распространенными типами медиаформатов являются следующие:
текст/html: формат HTML text/plain: обычный текстовый формат текст/xml: формат XML image/gif: формат изображения gif image/jpeg: формат изображения jpg. image/png: формат изображения png
Типы медиаформатов, начиная с приложения:
application/xhtml+xml: формат XHTML application/xml: формат данных XML. application/atom+xml: формат агрегирования XML Atom. application/json: формат данных JSON. приложение/pdf: формат pdf application/msword: формат документа Word. application/octet-stream: данные двоичного потока (например, общие загрузки файлов) application/x-www-form-urlencoded: encType по умолчанию, данные формы формы кодируются в формате ключ/значение и отправляются на сервер (формат по умолчанию для данных отправки формы).
// Указано в параметрах загрузки
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.bucket(bucket)
.object(objectName)
// Укажите соответствующий ContentType при загрузке.
.contentType(ViewContentType.getContentType(objectName))
.stream(multipartFile.getInputStream(), multipartFile.getSize(), 1024*1024*5+1)
.build();
//Перечислить Content-Type некоторых изображений
public enum ViewContentType {
DEFAULT("default","application/octet-stream"),
JPG("jpg", "image/jpeg"),
TIFF("tiff", "image/tiff"),
GIF("gif", "image/gif"),
JFIF("jfif", "image/jpeg"),
PNG("png", "image/png"),
TIF("tif", "image/tiff"),
ICO("ico", "image/x-icon"),
JPEG("jpeg", "image/jpeg"),
WBMP("wbmp", "image/vnd.wap.wbmp"),
FAX("fax", "image/fax"),
NET("net", "image/pnetvue"),
JPE("jpe", "image/jpeg"),
RP("rp", "image/vnd.rn-realpix");
private String prefix;
private String type;
public static String getContentType(String prefix){
if(StrUtil.isEmpty(prefix)){
return DEFAULT.getType();
}
prefix = prefix.substring(prefix.lastIndexOf(".") + 1);
for (ViewContentType value : ViewContentType.values()) {
if(prefix.equalsIgnoreCase(value.getPrefix())){
return value.getType();
}
}
return DEFAULT.getType();
}
ViewContentType(String prefix, String type) {
this.prefix = prefix;
this.type = type;
}
public String getPrefix() {
return prefix;
}
public String getType() {
return type;
}
}
public String shareObjectStream(String bucket, String objectKey) throws OssException {
Map<String,String> headers = new HashMap<>();
headers.put("response-content-type", "application/octet-stream");
String url = getMinioClient().getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucket)
.object(objectKey)
.expiry(60 * 60 * 24)
.extraQueryParams(headers)
.build());
return url;
}