Поддержка Spring для загрузки и скачивания файлов (реализация загрузки Spring)

Spring Boot задняя часть внешний интерфейс Spring
Поддержка Spring для загрузки и скачивания файлов (реализация загрузки Spring)

Сегодня я подведу итоги загрузки и скачивания файлов в 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-fileuploadpackage, поэтому нам нужен 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 также обеспечивает соответствующую поддержку. Спасибо за чтение!