Encontrei muitos problemas ao usar o Springboot para fazer upload de arquivos. Então, depois de ler muitas postagens no blog, finalmente melhorei a função de upload de acordo, então a gravei aqui para minha futura revisão.
Primeiro, estamos criando um projeto padrão de troca. O IDE usado aqui é a idéia intellige. Para fácil configuração, o arquivo de configuração padrão é substituído pelo Application.yml.
1. A função de upload de arquivo é executada no index.html. O método de upload de arquivo usado aqui é Ajax. Obviamente, você também pode usar arquivos de formulário tradicionais para fazer upload de acordo com seus requisitos específicos.
<! Doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> teste de upload </title> <script type = "text/javascript" src = "js/jQuery-3.2.1.min.js"> </script> <br/> <botão id = "upload" onclick = "dupload ()"> upload </button> <progresso id = "progressBar" value = "0" max = "100"> </progress> <cript> function dupload () {var fileobj = document.getElementById ("arquivo"). // js obtenha o objeto de arquivo var FileController = "/upload"; // Receba o endereço de segundo plano do arquivo carregado // formData objeto var form = new FormData (); form.Append ("FILE", FILEOBJ); // xmlHttPrequest Object var xhr = novo xmlHttPrequest (); // Adicione a função de processamento de retorno xhr.onReadyStateChange = function () {if (this.readyState == 4 && this.status == 200) {var b = this.ResponseText; if (b == "success") {alert ("upload bem -sucedido!"); } else {alert ("Falha no upload!"); }}}}; xhr.open ("post", fileController, true); // Use a barra de progresso para gravar o progresso do upload xhr.upload.addeventListener ("Progress", ProgressFunction, false); xhr.send (form); } função ProgressFunction (EVT) {var ProgressBar = document.getElementById ("ProgressBar"); var percentual = document.getElementById ("porcentagem"); if (evt.lengthcomputable) {progressbar.max = evt.total; ProgressBar.Value = Evt.Loaded; percentagediv.innerhtml = math.round (evt.loaded / evt.total * 100) + "%"; }} </script> </body> </html> 2. Adicione a API de upload de arquivo no MainController e retorne os resultados do upload
@PostMapping ("/upload") @ResponseBody Public String Upload (httpServletRequest Solicy, @RequestParam ("FILE") FILETFILE) {String path = "e: // upload //"; String filename = FILE.GETORGINALFILENAME (); System.out.println (nome do arquivo); Arquivo TargetFile = novo arquivo (caminho); if (! TargetFile.Exists ()) {TargetFile.mkdirs (); } Arquivo savefile = novo arquivo (caminho+nome do arquivo); // salvar tente {file.transferto (savefile); retornar "sucesso"; } catch (Exceção e) {e.printStackTrace (); retornar "falha"; }}No momento, realizamos testes e podemos descobrir que o upload de arquivo foi concluído.
Muitas vezes, quando enviamos arquivos, especialmente ao abrir a função de upload de arquivos para usuários comuns, precisamos controlar o formato do arquivo carregado para impedir que os hackers enviem scripts de vírus. A maneira de simplesmente interceptar o tipo de nome do arquivo é muito fácil de quebrar. O uploader precisa apenas alterar o vírus para arquivar o nome para concluir o upload.
Neste momento, podemos ler o cabeçalho do arquivo hexadecimal do arquivo para determinar o formato verdadeiro do arquivo.
Como descobrimos que, quando lemos os dados binários do arquivo e os convertemos em hexadecimal, os dados do cabeçalho do arquivo do mesmo tipo de arquivo são os mesmos e, mesmo que o sufixo seja alterado, esses dados não serão alterados. Por exemplo, o cabeçalho do arquivo do arquivo PNG é "89504E47".
Primeiro, lemos os dados do arquivo
classe pública FileUtil {public static string getFileHeader (arquivo multipart de arquivo) {inputStream is = null; String value = null; tente {is = file.getInputStream (); byte [] b = novo byte [4]; is.read (B, 0, B.Length); valor = bytestoHexString (b); } catch (Exceção e) {} finalmente {if (null! = is) {try {is.close (); } catch (ioexception e) {}} retornar valor; } string estática privada 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] e 0xff) .touppercase (); if (hv.Length () <2) {Builder.append (0); } builder.append (hv); } System.out.println (builder.toString ()); retornar construtor.toString (); }}Em seguida, faça a chamada na API carregada de arquivo
FileUtil.getFileHeader (arquivo)
No momento, precisamos executar apenas uma comparação simples de string e determinar se o valor de retorno da chamada é "89504E47", e podemos saber se o upload é um arquivo PNG.
Vamos dar uma olhada no Java para obter e julgar as informações do cabeçalho do arquivo
importar java.io.fileInputStream; importar java.io.ioException; importar java.util.hashmap; / ** * Obtenha e juiz as informações do cabeçalho do arquivo * * @Author Sud * */ public classe getTypebyhead {// Informações do cabeçalho do arquivo de cache - Informações sobre o cabeçalho do arquivo public estático final hashmap <string, string> mfiletypes = new hashmap <string, string> (); estático {// imagens 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"); // diário mfiletypes.put ("3c3f786d6c", "xml"); mfiletypes.put ("68746d6c3e", "html"); mfiletypes.put ("44656C69766572792D646174653a", "EML"); // email 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"); } / ** * Obtenha informações do cabeçalho do arquivo com base no caminho do arquivo * * @param filepath * caminho do arquivo * @return Informações do cabeçalho do arquivo * / public static string getFileType (string filepath) {System.out.println (getFileHeader (filepath)); System.out.println (mfiletypes.get (getfileheader (filepath))); return mfiletypes.get (getfileheader (filepath)); } / ** * Obtenha as informações do cabeçalho do arquivo com base no caminho do arquivo * * @param filepath * caminho do arquivo * @return Informações do cabeçalho do arquivo * / public static string getFileheader (string filepath) {FileInputStream is = null; String value = null; tente {is = new FileInputStream (filepath); byte [] b = novo byte [4]; / * * int read () Leia um byte de dados a partir deste fluxo de entrada. int read (byte [] b) Leia até uma matriz de bytes de dados de b.length * bytes a partir deste fluxo de entrada. int read (byte [] b, int off, int len) * Leia até len bytes de dados deste fluxo de entrada em uma matriz de bytes. */ is.read (b, 0, b.Length); valor = bytestoHexString (b); } catch (Exceção e) {} finalmente {if (null! = is) {try {is.close (); } catch (ioexception e) {}}} retornar valor; } / ** * Converta a matriz de bytes do arquivo para ler as informações do cabeçalho do arquivo em um tipo de string que representa * * @param src * matriz de bytes do arquivo para ler as informações do cabeçalho do arquivo * @return ingleer Informações * / String STATIDRATILDBULIDER (BYTE) {Strc) {StringBuilder Builder = NewBilderBuilder (Byte [] src) {StringBilder Builder = Builder = if (src == null || src.length <= 0) {return null; } String hv; para (int i = 0; i <src.length; i ++) {// retorna uma representação de sequência de um parâmetro inteiro no número inteiro não assinado hexadecimal (base 16) e converta -o em uppercase hv = integer.tohexstring (src [i] e 0xff) .Toupcase (); if (hv.Length () <2) {Builder.append (0); } builder.append (hv); } System.out.println (builder.toString ()); retornar construtor.toString (); } public static void main (string [] args) lança Exceção {final string filetype = getFileType ("d: //ry4s_java.dll"); System.out.println (FileType); }}Resumir
O acima exposto é o controle de upload do arquivo de troca e a aquisição de Java e as informações do cabeçalho do arquivo de julgamento introduzidas a você. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!