Encontré muchos problemas al usar SpringBoot para cargar archivos. Entonces, después de leer muchas publicaciones de blog, finalmente mejoré la función de carga en consecuencia, así que la grabé aquí para mi futura revisión.
Primero, estamos creando un proyecto SpringBoot estándar. El IDE utilizado aquí es Idea IntelliJ. Para una fácil configuración, el archivo de configuración predeterminado se reemplaza con Application.yml.
1. La función de carga de archivo se realiza en index.html. El método de carga de archivos utilizado aquí es AJAX. Por supuesto, también puede usar archivos de formulario tradicionales para cargar de acuerdo con sus requisitos específicos.
<! DOCTYPE HTML> <html lang = "en"> <fead> <meta charset = "utf-8"> <title> test de carga </title> <script type = "text/javascript" src = "js/jQuery-3.2.2.1.min.js"> </script> </ Head> <fain Id = "File" File "File" File "/" File "/"/"File"/"/" File "/". <botón id = "cargue" onClick = "douPload ()"> upload </boton> <progress id = "progressbar" value = "0" max = "100"> </progress> <script> function douPload () {var fileObj = document.getElementByid ("archivo"). Archivos [0]; // JS Get File Object var fileController = "/upload"; // Recibe la dirección de fondo del archivo cargado // FormData Object var Form = new FormData (); form.append ("archivo", fileObj); // xmlhttprequest object var xhr = new xmlhttprequest (); // Agregar función de procesamiento de retorno xhr.onreadyStateChange = function () {if (this.readyState == 4 && this.status == 200) {var b = this.ResponSetext; if (b == "éxito") {alerta ("¡Cargue exitoso!"); } else {alerta ("¡Cargar fallido!"); }}}}; xhr.open ("post", fileController, verdadero); // Use la barra de progreso para registrar el progreso de carga xhr.upload.addeventListener ("Progress", ProgressFunction, False); xhr.send (formulario); } function ProgressFunction (evt) {var progressbar = document.getElementById ("ProgressBar"); var por porcentediv = document.getElementById ("porcentaje"); if (evt.lengthComputable) {progressbar.max = evt.total; ProgressBar.Value = evt.loaded; porcentaje.innerhtml = math.round (evt.loaded / evt.total * 100) + "%"; }} </script> </body> </html> 2. Agregue la API de carga de archivos en MainController y devuelva los resultados de carga
@PostMapping ("/upload") @ResponseBody public String upload (httpservletRequest request, @RequestParam ("file") archivo multipartfile) {string path = "e: // upload //"; Cadena filename = file.getOriginalFileName (); System.out.println (nombre de archivo); Archivo TargetFile = nuevo archivo (ruta); if (! TargetFile.Exists ()) {TargetFile.MkDirs (); } Archivo saveFile = nuevo archivo (ruta+nombre de archivo); // Guardar try {file.transferto (saveFile); devolver "éxito"; } catch (Exception e) {E.PrintStackTrace (); devolver "fallas"; }}En este momento, realizamos pruebas y podemos encontrar que la carga de archivo se ha completado.
Muchas veces, cuando cargamos archivos, especialmente al abrir la función de carga de archivos a los usuarios comunes, necesitamos controlar el formato del archivo cargado para evitar que los piratas informáticos carguen scripts de virus. La forma de simplemente interceptar el tipo de nombre de archivo es muy fácil de descifrar. El cargador solo necesita cambiar el virus al nombre del archivo para completar la carga.
En este momento, podemos leer el encabezado del archivo hexadecimal del archivo para determinar el formato verdadero del archivo.
Debido a que descubrimos que cuando leemos los datos binarios del archivo y los convertimos en hexadecimal, los datos del encabezado del archivo del mismo tipo de archivo son los mismos, e incluso si su sufijo se cambia, estos datos no cambiarán. Por ejemplo, el encabezado del archivo del archivo PNG es "89504E47".
Primero, leemos los datos del archivo
public class FileUtil {public static string getFileHeader (archivo multipartfile) {inputStream is = null; Valor de cadena = nulo; try {is = file.getInputStream (); byte [] b = nuevo byte [4]; IS.Read (B, 0, B.Length); valor = bytestoHexString (b); } catch (excepción e) {} finalmente {if (null! = is) {try {is.close (); } catch (ioException e) {}} Valor de retorno; } string static privado bytestoHexString (byte [] src) {StringBuilder Builder = new StringBuilder (); if (src == null || src.length <= 0) {return null; } Cadena hv; for (int i = 0; i <src.length; i ++) {hv = integer.tohexString (src [i] & 0xff) .toUpperperCase (); if (hv.length () <2) {builder.append (0); } builder.append (HV); } System.out.println (Builder.ToString ()); return builder.ToString (); }}Luego haga la llamada en la API cargada de archivo
Fileutil.getFileHeader (archivo)
En este momento, solo necesitamos realizar una comparación de cadenas simple y determinar si el valor de retorno de la llamada es "89504E47", y podemos saber si la carga es un archivo PNG.
Echemos un vistazo a Java para obtener y juzgar la información del encabezado del archivo
import java.io.fileInputStream; import java.io.ioException; import java.util.hashmap; / ** * Obtener y juzgar la información del encabezado de archivo * * @author sud * */ public class getTypebyhead {// Información del encabezado del archivo de caché - Información del encabezado del archivo Public estático final Hashmap <String, String> mfiletypes = new Hashmap <String, String> (); static {// imágenes 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"); // diario mfiletypes.put ("3C3f786d6c", "xml"); mfiletypes.put ("68746d6c3e", "html"); mfiletypes.put ("44656c69766572792d646174653a", "EML"); // Envíe un correo electrónico a 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"); } / ** * Obtenga información del encabezado de archivo basada en la ruta del archivo * * @param filepath * ruta del archivo * @return información del encabezado del archivo * / public static string getFileType (string filepath) {system.out.println (getFileHeader (filePath)); System.out.println (mfiletypes.get (getFileHeader (filepath))); devolver mfiletypes.get (getFileHeader (FilePath)); } / ** * Obtenga información del encabezado de archivo basada en la ruta del archivo * * @param filepath * ruta del archivo * @@return información del encabezado * / public static string getFileHeader (String filePath) {fileInputStream is = null; Valor de cadena = nulo; prueba {IS = nuevo FileInputStream (FilePath); byte [] b = nuevo byte [4]; / * * int read () Leer un byte de datos de esta secuencia de entrada. int read (byte [] b) Leer hasta una matriz de datos de bytes de B.Length * bytes de esta secuencia de entrada. int read (byte [] b, int off, int len) * Leer hasta los bytes de datos de esta transmisión de entrada en una matriz de bytes. */ is.read (b, 0, b.length); valor = bytestoHexString (b); } catch (excepción e) {} finalmente {if (null! = is) {try {is.close (); } catch (ioException e) {}}} Valor de retorno; } / ** * Convierta la matriz de bytes del archivo para leer la información del encabezado del archivo en un tipo de cadena que representa * * @param src * byte matriz del archivo para leer la información del encabezado del archivo * @return faller información * / static string bytestoString (byte [] src) {stringBuilder Builder = new StringBuilder ();; if (src == null || src.length <= 0) {return null; } Cadena hv; for (int i = 0; i <src.length; i ++) {// Devuelve una representación de cadena de un parámetro entero en hexadecimal (base 16) sin signo entero y conviértelo a mayúsculas hv = entergio.tohexstring (SRC [i] & 0xff) .ToUppperCase (); if (hv.length () <2) {builder.append (0); } builder.append (HV); } System.out.println (Builder.ToString ()); return builder.ToString (); } public static void main (string [] args) lanza la excepción {Final String fileType = getFileType ("d: //ry4s_java.dll"); System.out.println (Tipo de filete); }}Resumir
Lo anterior es el control de carga de archivo SpringBoot y la información de adquisición de Java y el encabezado del archivo de juicio que se le presenta. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!