Сегодня я подведу итоги загрузки и скачивания файлов в Spring.Перед написанием этого блога я написал сообщение в блоге о загрузке и скачивании файлов------React Native загружает изображения в облачное хранилище Qiniu, в этом сообщении в блоге в основном рассказывается о том, как загружать файлы в облачное хранилище Qiniu с помощью фреймворка React Native.Бэкенд-часть в основном интегрирует API, предоставляемый облаком Qiniu, но не говорит об основном принципе загрузки и скачивания файлов из нижний слой, так что эта статья Этот пост в блоге пытается компенсировать предыдущие недостатки Далее, давайте начнем вместе!
Во-первых, основной принцип загрузки и выгрузки файлов Java.
Что касается веб-сайта Java, для загрузки файла интерфейсный браузер отправляет файл, а затем серверная обработка возвращает результат успешной или неудачной загрузки файла; для загрузки файла во многих случаях интерфейс нажимает кнопку или нажимает текстовую ссылку, затем браузер автоматически загружает файл на локальный. Так в чем же причина этого? Редактор считает, что загрузка и выгрузка файлов в основном обрабатываются через потоковый API, предоставляемый Java.В сервлете мы можем использовать Http-связанныйHttpServletResponse
Объект выводит файловый поток в браузер.Конечно, это связано с тем, как наш браузер определяет, является ли поток файлом или текстовой строкой, поэтому при загрузке и загрузке файла также упоминается настройка типа Mime заголовка HTTP-запроса.
Редактор раньше задумывался над таким вопросом, я сейчас буду использовать html форму для загрузки файла, но когда использую фреймворк, то не совсем понимаю принцип. В этом вопросе, по мнению редактора, принцип тот же, самое главное — отправить запрос на загрузку файла через форму, то есть в html.<input type="file"/>
Метки, независимо от того, как ваш фреймворк их инкапсулирует, нижний слой — это форма. Давайте поговорим о том, как использовать Spring boot для загрузки и скачивания файлов.В интерфейсной части этого примера используется простая html-форма без использования какой-либо инфраструктуры, которую легко понять.
2. Spring поддерживает загрузку и скачивание файлов
В среде Spring поддержка загрузки и скачивания файлов осуществляется черезMultipartFile
интерфейс для реализации,MultipartFile
Это означает файл, отправленный клиентом, иMultipartFile[]
Массив представляет несколько файлов, отправленных клиентом, что очень полезно при реализации нескольких загрузок файлов.Конечно, через этот интерфейс вы можете получить некоторую основную информацию о файлах, отправленных клиентом, такую как имя файла, размер файла и т. д. , Конечно, вы также можете разрешить Spring ограничивать размер и тип файлов, отправляемых клиентом (например, файлы изображенийpng
или текстовый файлtxt
), но настройка реализации этих функций выходит за рамки этой статьи.
Традиционное использование Spring MVC в стиле REST выполняется с помощью@Controller
,@ResponseBody
и@RequestMapping
Реализовано тремя аннотациями, в Spring Boot нужно только использовать@RestController
и@RequestMapping
Достаточно двух аннотаций, простой пример выглядит следующим образом:
/**
* 测试文件上传与下载
*
* @author hjw
*
*/
@RestController
public class FileUploadCotroller {
@RequestMapping(value = "/upload.json", method = RequestMethod.POST)
public boolean fileUpload( MultipartFile file) throws IllegalStateException, IOException {
return false;
}
}
Поскольку среда Spring зависит отcommons-fileupload
package, поэтому нам нужен mavenpom.xml
Пакет jar импортируется в файл.
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
3. Использование Spring Boot для загрузки и скачивания одного файла
1. Загрузка файла
upload.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="http://localhost:8081/upload.json" method="POST" enctype="multipart/form-data">
<input name="file" type="file"/>
<button type="submit">single submit</button>
</form>
</body>
</html>
FileUploadCotroller.java
@RestController
public class FileUploadCotroller {
@RequestMapping(value = "/upload.json", method = RequestMethod.POST)
public boolean fileUpload( MultipartFile file) throws IllegalStateException, IOException {
if (file.getSize() == 0) {
return false;
}
System.err.println("文件是否为空 : " + file.isEmpty());
System.err.println("文件的大小为 :" + file.getSize());
System.err.println("文件的媒体类型为 : " + file.getContentType());
System.err.println("文件的名字: " + file.getName());
System.err.println("文件的originName为: " + file.getOriginalFilename());
File newFile = new File("C:\\Users\\hjw\\Desktop\\" + file.getOriginalFilename());
file.transferTo(newFile);
return true;
}
}
Вышеупомянутая форма файла html должна установить формуenctype
собственностьenctype="multipart/form-data"
,и<input/>
помеченname
Значение свойства должно соответствовать внутреннему интерфейсу.MultipartFile
Имена параметров совпадают, т. е. обаfile
2. Загрузка файла
Передняя часть загрузки файла очень проста, мы напрямую используем<a><a/>
Этикетки подойдут.
download.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="http://localhost:8081/download.json">single download</a>
</body>
</html>
FileUploadCotroller.java
@RequestMapping(value="download.json")
public boolean download(HttpServletResponse res) throws IOException {
File file = new File("C:\\Users\\hjw\\Desktop\\design\\code\\project-1\\myapp\\src\\images\\seats\\bg1.png");
String fileName = "bg1.png";
res.setHeader("Content-Disposition", "attachment;filename=" + fileName);
byte[] buff = new byte[1024];
BufferedInputStream bis = null;
OutputStream os = null;
try {
os = res.getOutputStream();
bis = new BufferedInputStream(new FileInputStream(file));
int i = bis.read(buff);
while (i != -1) {
os.write(buff, 0, buff.length);
os.flush();
i = bis.read(buff);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("success");
return false;
}
}
Вышеуказанная загрузка файла передается в виде потока.Обратите внимание, что для достижения функции загрузки файла мы должны установить заголовок ответаHttp Header
изContent-Disposition
параметр, который активирует функцию загрузки браузера и принимает файлы, которые мы передаем.
В-четвертых, используйте Spring Boot для загрузки нескольких файлов.
Вышеупомянутая многофайловая загрузка соответствуетMultipartFile[]
Массив, поэтому нам нужно изменить только параметры бэкенда.
multiUpload.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="http://localhost:8081/multiFile.json" enctype="multipart/form-data" method="post">
<input name="files" type="file" multiple="multiple" value="请选择多个文件"/>
<button type="submit">multi submit second</button>
</form>
</body>
</html>
FileUploadCotroller.java
@RequestMapping(value="multiFile.json",method=RequestMethod.POST)
public boolean multiFile(MultipartFile[] files) throws IllegalStateException, IOException {
if(files.length == 0) {
return false;
}
File file = null;
String path = "C:\\Users\\hjw\\Desktop\\";
for (int i = 0; i < files.length; i++) {
System.err.println("第" + i + "个文件的大小为" + files[i].getSize());
System.err.println("第" + i + "个文件是否为空" + files[i].isEmpty());
System.err.println("第" + i + "个文件的媒体类型为" + files[i].getContentType());
System.err.println("第" + i + "个文件的文件名为" + files[i].getName());
System.err.println("第" + i + "个文件的源文件名为" + files[i].getOriginalFilename());
file = new File(path + files[i].getOriginalFilename());
files[i].transferTo(file);
}
return false;
}
Обратите внимание, что мы хотим установить файл html<input/>
помеченmultiple
собственностьmultiple="multiple"
, этот атрибут указывает, что поддерживаются операции выбора нескольких файлов. В то же время, как и при загрузке одного файла, наша<input/>
помеченname
Свойство должно соответствовать серверной частиMultipartFile[]
Имена параметров совпадают, т.е.files
.
Суммировать
Эти примеры очень просты и относятся к начальному уровню.Конечно, не так просто добиться успеха в загрузке и скачивании файлов, но наши повседневные проекты не очень требовательны к функциям загрузки и скачивания файлов (таким как Thunder), конечно, если вы хотите сделать продвинутую одну точку, вы можете использовать классы произвольного доступа к файлам, предоставляемые JavaRandomAccessFile
Для достижения загрузки и загрузки точки останова функция загрузки и загрузки точки останова http также обеспечивает соответствующую поддержку.
Спасибо за чтение!