Я столкнулся с множеством проблем при использовании Springboot для загрузки файлов. Поэтому после прочтения многих сообщений в блоге я наконец -то улучшил функцию загрузки соответственно, поэтому я записал ее здесь для своего будущего обзора.
Во -первых, мы создаем стандартный проект Springboot. IDE, используемая здесь, - это INTELLIJ IDEA. Для легкой конфигурации файл конфигурации по умолчанию заменяется Application.yml.
1. Функция загрузки файла выполняется в index.html. Используемый здесь метод загрузки файла является Ajax. Конечно, вы также можете использовать традиционные файлы форм для загрузки в соответствии с вашими конкретными требованиями.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Upload test</title> <script type="text/javascript" src="js/jquery-3.2.1.min.js"></script> </head> <body> <input id="file" type="file" name="file"/> <br/> <button id = "upload" onclick = "doupload ()"> upload </button> <progress id = "progressbar" value = "0" max = "100"> </progress> <script> function doupload () {var fileObj = document.getElementById ("файл"). // js получить файл объект var filecontroller = "/upload"; // получение фонового адреса загруженного файла // объект FormData var form = new FormData (); form.append ("file", fileobj); // xmlhttprequest объект var xhr = new xmlhttprequest (); // Добавить функцию обработки возврата xhr.onreadystatechange = function () {if (this.readystate == 4 && this.status == 200) {var b = this.responsetext; if (b == "успех") {alert ("загрузить успешно!"); } else {alert ("upload не удалась!"); }}}}; xhr.open ("post", filecontroller, true); // Использование панели прогресса для записи прогресса загрузки xhr.upload.addeventListener («Прогресс», ProgressFunction, false); xhr.send (форма); } function progressFunction (evt) {var progressBar = document.getElementById ("ProgressBar"); var inestagediv = document.getElementById («процент»); if (evt.lengthcomputable) {progressbar.max = evt.total; progressbar.value = evt.loaded; процентгенгив.innerhtml = math.round (evt.loaded / evt.total * 100) + "%"; }} </script> </body> </html> 2. Добавить API загрузки файла в MainController и вернуть результаты загрузки
@Postmapping ("/upload") @responsebody public string upload (httpservletrequest запрос, @requestparam ("file") multiplaartfile file) {string path = "e: // upload //"; String fileName = file.getoriginalfilename (); System.out.println (имя файла); File TargetFile = новый файл (path); if (! targetfile.exists ()) {targetfile.mkdirs (); } Файл saveFile = новый файл (Path+FileName); // Сохранить try {file.transferto (saveFile); вернуть "успех"; } catch (Exception e) {e.printstackTrace (); вернуть "Fail"; }}В настоящее время мы проводим тесты и можем обнаружить, что загрузка файла была завершена.
Много раз, когда мы загружаем файлы, особенно при открытии функции загрузки файла для обычных пользователей, нам нужно контролировать формат загруженного файла, чтобы хакеры не загружали вирусные сценарии. Способ просто перехватить тип файла очень легко взломать. Загрузчик должен только изменить вирус на имя файла, чтобы завершить загрузку.
В настоящее время мы можем прочитать шестнадцатеричный заголовок файла файла, чтобы определить истинный формат файла.
Поскольку мы обнаружили, что когда мы читаем двоичные данные файла и конвертируем их в шестнадцатеричную данные, данные заголовка файла того же типа файла одинаковы, и даже если его суффикс будет изменен, эти данные не изменятся. Например, заголовок файла файла PNG «89504E47».
Сначала мы читаем данные файла
public class fileutil {public static String getFileHeader (MultipartFile файл) {inputStream IS = null; String value = null; try {is = file.getInputStream (); байт [] b = новый байт [4]; is.read (b, 0, b.length); value = byteStohexString (b); } catch (Exception e) {} наконец {if (null! = is) {try {is.close (); } catch (ioException e) {}} return value; } private Static String ByteStoHexString (byte [] src) {stringBuilder Builder = new StringBuilder (); if (src == null || src.length <= 0) {return null; } String HV; for (int i = 0; i <src.length; i ++) {hv = integer.tohexstring (src [i] & 0xff) .touppercase (); if (hv.length () <2) {builder.append (0); } builder.append (hv); } System.out.println (builder.tostring ()); return Builder.toString (); }}Затем сделайте вызов в загруженном файле API
Fileutil.getFileHeader (файл)
В настоящее время нам нужно только выполнить простое сравнение строк и определить, является ли возвращаемое значение вызова «89504E47», и мы можем знать, является ли загрузка файлом PNG.
Давайте посмотрим на Java, чтобы получить информацию о заголовке файлов
импортировать java.io.fileinputstream; импортировать java.io.ioexception; импортировать java.util.hashmap; / ** * Получить и судить информацию об заголовке файлов * * @author sud * */ public class gettypebyhead {// Информация заголовка файла кэша - информация заголовка файла public static final hashmap <String, String> mfileTypes = new Hashmap <String, String> (); static {// Images mfileTypes.put ("ffd8ff", "jpg"); mfiletypes.put ("89504e47", "png"); mfiletypes.put ("47494638", "GIF"); mfiletypes.put ("49492a00", "tif"); mfiletypes.put ("424d", "bmp"); // mfileTypes.put ("41433130", "DWG"); // cad mfiletypes.put ("38425053", "psd"); mfiletypes.put ("7b5c727466", "rtf"); // дневник mfileTypes.put ("3C3F786D6C", "xml"); mfiletypes.put ("68746d6c3e", "html"); mfiletypes.put ("44656C69766572792D646174653A", "EML"); // электронная почта mfiletypes.put ("d0cf11e0", "doc"); mfiletypes.put ("5374616e64617264204a", "MDB"); mfiletypes.put ("252150532d41646f6265", "ps"); mfiletypes.put ("255044462d312e", "pdf"); mfiletypes.put ("504b0304", "docx"); mfiletypes.put ("52617221", "rar"); mfiletypes.put ("57415645", "wav"); mfiletypes.put ("41564920", "avi"); mfiletypes.put ("2e524d46", "rm"); mfiletypes.put ("000001ba", "MPG"); mfiletypes.put ("000001b3", "MPG"); mfiletypes.put ("6d6f6f76", "mov"); mfiletypes.put ("3026b2758e66cf11", "asf"); mfiletypes.put ("4D546864", "Mid"); mfiletypes.put ("1f8b08", "gz"); mfiletypes.put ("4d5a9000", "exe/dll"); mfiletypes.put ("75736167", "txt"); } / ** * Получить информацию об заголовке файла на основе пути файла * * @param filePath * pail Path * @return Информация о заголовке файла * / public static String getFileType (String filePath) {System.out.println (getFileHeader (filePath)); System.out.println (mFileTypes.get (getFileHeader (filePath))); вернуть mfileTypes.get (getFileHeader (filePath)); } / ** * Получить информацию об заголовке файла на основе пути файла * * @param filePath * Pail Path * @return Информация о заголовке файла * / public Static String getFileHeader (String filePath) {fileInputStream IS = null; String value = null; try {is = new FileInputStream (filePath); байт [] b = новый байт [4]; / * * int Read () Прочитайте байт данных из этого входного потока. int Read (byte [] b) Считайте до массива данных данных B.Length * из этого входного потока. int Read (byte [] b, int off, int len) * Читать до байтов данных из этого входного потока в массив байтов. */ is.read (b, 0, b.length); value = byteStohexString (b); } catch (Exception e) {} наконец {if (null! = is) {try {is.close (); } catch (ioException e) {}}} возвращаемое значение; } / ** * Конвертировать массив байтов файла, чтобы прочитать информацию о заголовке файла в тип строки, представляющий * * @param src * байтовый массив файла для чтения информации заголовка файла * @return Header * / private Static String Bytestohexstring (byte [] src) {StringBuilder builder = new StringBuilder (); if (src == null || src.length <= 0) {return null; } String HV; для (int i = 0; i <src.length; i ++) {// возвращать строковое представление целочисленного параметра в шестнадцатеричном (базе 16) не знакового целого числа и преобразуйте его в верхний hv = integer.tohexstring (src [i] & 0xff) .touppercase (); if (hv.length () <2) {builder.append (0); } builder.append (hv); } System.out.println (builder.tostring ()); return Builder.toString (); } public static void main (string [] args) бросает исключение {final String fileType = getFileType ("d: //ry4s_java.dll"); System.out.println (fileType); }}Суммировать
Выше представлено управление загрузкой файла Springboot, а также информация о заголовке файлов файлов Java и суждением, представленная вам. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!