SpringBoot를 사용하여 파일을 업로드 할 때 많은 문제가 발생했습니다. 그래서 많은 블로그 게시물을 읽은 후 마침내 업로드 기능을 개선하여 향후 검토를 위해 여기에 기록했습니다.
먼저 표준 SpringBoot 프로젝트를 만들고 있습니다. 여기에 사용 된 IDE는 Intellij 아이디어입니다. 쉽게 구성하려면 기본 구성 파일이 application.yml로 대체됩니다.
1. 파일 업로드 함수는 index.html에서 수행됩니다. 여기에 사용 된 파일 업로드 방법은 Ajax입니다. 물론 기존 양식 파일을 사용하여 특정 요구 사항에 따라 업로드 할 수도 있습니다.
<! doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> 테스트 </title> <script type = "text/javaScript"src = "js/jquery-3.2.1.min.js"> <br/> <button id = "upload"onclick = "doupload ()"> ubload </button> <progress id = "progressbar"value = "0"max = "100"> </progress> <cript> function doupload () {var fileobj = document.getElementById ( "file"); // js가 파일 객체 var 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 == "success") {alert ( "업로드 성공!"); } else {alert ( "업로드 실패!"); }}}}; xhr.open ( "post", filecontroller, true); // 진행률 표시 줄을 사용하여 업로드 진행 상황 xhr.upload.addeventListener ( "Progress", ProgressFunction, False); xhr.send (form); } function progressfunction (evt) {var progressBar = document.getElementById ( "ProgressBar"); var 백분율 = 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. MainController에서 파일 업로드 API를 추가하고 결과 업로드 결과를 반환합니다.
@postmapping ( "/upload") @ResponseBody public string upload (httpservletrequest request, @requestparam ( "file") multipartfile 파일) {String path = "e : // ubload //"; 문자열 filename = file.getoriginalFilename (); System.out.println (filename); 파일 targetFile = 새 파일 (Path); if (! targetfile.exists ()) {targetfile.mkdirs (); } 파일 savefile = 새 파일 (path+filename); // 시도를 저장 {file.transferto (savefile); "성공"을 반환합니다. } catch (예외 e) {e.printstacktrace (); "실패"를 반환합니다. }}현재 테스트를 수행하고 파일 업로드가 완료되었음을 알 수 있습니다.
파일을 업로드 할 때, 특히 일반 사용자에게 파일 업로드 함수를 열 때 해커가 바이러스 스크립트를 업로드하지 못하도록 업로드 된 파일의 형식을 제어해야합니다. 파일 이름 유형을 단순히 가로 채는 방법은 균열이 매우 쉽습니다. 업 로더는 바이러스를 파일 이름으로 변경하면 업로드를 완료하면됩니다.
현재 파일의 16 진 파일 헤더를 읽고 파일의 실제 형식을 결정할 수 있습니다.
파일의 이진 데이터를 읽고 16 진수로 변환 할 때 동일한 유형의 파일의 파일 헤더 데이터가 동일하며 접미사가 변경 되더라도이 데이터는 변경되지 않습니다. 예를 들어, PNG 파일의 파일 헤더는 "89504E47"입니다.
먼저 파일 데이터를 읽습니다
public class fileUtil {public static string getFileHeader (multipartFile 파일) {inputStream is = null; 문자열 값 = null; try {is = file.getInputStream (); 바이트 [] B = 새로운 바이트 [4]; is.read (b, 0, b.length); 값 = BytestoHexString (b); } catch (예외 e) {} 마지막으로 {if (null! = is) {try {is.close (); } catch (ioException e) {}} return 값; } private static string bytestoHexString (byte [] src) {StringBuilder builder = new StringBuilder (); if (src == null || src.length <= 0) {return null; } 문자열 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를 살펴 보겠습니다.
import java.io.fileInputStream; import java.io.ioexception; java.util.hashmap import; / ** * 파일 헤더 정보를 얻고 판단하고 판단합니다 * @author sud */ public class gettypebyhead {// 캐시 파일 헤더 정보 - 파일 헤더 정보 공개 정적 최종 해시 맵 <문자열, 문자열> 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 * 파일 path * @return 파일 헤더 정보 * / public static string getFileType (String FilePath) {System.out.println (getFileHeader (filepath)); System.out.println (mfiletypes.get (getFileHeader (filepath))); return mfileTypes.get (getFileHeader (FilePath)); } / ** * 파일 경로를 기반으로 파일 헤더 정보 가져 오기 * * @param filepath * 파일 path * @return 파일 헤더 정보 * / public static string getFileHeader (String FilePath) {fileInputStream is = null; 문자열 값 = 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); 값 = BytestoHexString (b); } catch (예외 e) {} 마지막으로 {if (null! = is) {try {is.close (); } catch (ioException e) {}}} return 값; } / ** * 파일의 바이트 배열을 파일 헤더 정보를 문자열 유형으로 읽으려면 * * @param src * 파일의 바이트 배열 파일 헤더 정보 * @return 파일 헤더 정보 * / private String byTestoHexString (byte [] src) {stringBuilder = new StringBuilder (); if (src == null || src.length <= 0) {return null; } 문자열 HV; for (int i = 0; i <src.length; i ++) {// hexadecimal (기본 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 웹 사이트를 지원해 주셔서 대단히 감사합니다!