Springbootを使用してファイルをアップロードする際に多くの問題が発生しました。したがって、多くのブログ投稿を読んだ後、最終的にアップロード機能を改善したので、将来のレビューのためにここに記録しました。
まず、標準のスプリングブートプロジェクトを作成しています。ここで使用されるIDEはIntellijのアイデアです。簡単な構成のために、デフォルトの構成ファイルは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"> </> <input id> <input id> <input id> <input id = "ファイル<button id = "upload" onclick = "doupload()"> upload </button> <progress id = "progressbar" value = "0" "max =" 100 "> </進行> <スクリプト> function doupload(){var fileobj = document.getelementbyid(" file ")。ファイル[0]; // js get file object var filecontroller = "/upload"; //アップロードされたファイルの背景アドレスを受信します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( "upload success!"); } else {alert( "upload failed!"); }}}}; xhr.open( "post"、filecontroller、true); //進行状況バーを使用して、アップロードProgress xhr.upload.addeventlistener( "Progress"、ProgressFunction、false)を記録します。 xhr.send(form); } function ProgressFunction(evt){var progressbar = document.getElementById( "ProgressBar"); var perpertagediv = document.getElementById( "パーセンテージ"); if(evt.lengthcomputable){progressbar.max = evt.total; ProgressBar.Value = evt.Loaded; perperatediv.innerhtml = math.round(evt.loaded / evt.total * 100) + "%"; }} </script> </body> </html> 2.メインコントローラーにファイルアップロードAPIを追加し、結果を返します結果
@postmapping( "/upload")@responsebody public string upload(httpservletrequest request、 @requestparam( "file")multipartfile file){string path = "e:// upload //"; string filename = file.getoriginalFileName(); System.out.println(filename);ファイルターゲットファイル= newファイル(PATH); if(!targetfile.exists()){targetfile.mkdirs(); } file savefile = new file(path+filename); // save try {file.transferto(savefile); 「成功」を返します。 } catch(Exception e){e.printstacktrace(); 「失敗」を返します。 }}現時点では、テストを実施し、ファイルのアップロードが完了したことがわかります。
多くの場合、ファイルをアップロードするとき、特にファイルのアップロード機能を通常のユーザーに開くときに、ハッカーがウイルススクリプトのアップロードを防ぐために、アップロードされたファイルの形式を制御する必要があります。ファイル名のタイプを単純に傍受する方法は、非常に簡単にクラックできます。アップローダーは、ウイルスを変更して名前をファイルするだけで、アップロードを完了する必要があります。
この時点で、ファイルの16進ファイルヘッダーを読み取り、ファイルの真の形式を決定できます。
ファイルのバイナリデータを読んで16進数に変換すると、同じタイプのファイルのファイルヘッダーデータが同じであることがわかったため、その接尾辞が変更されたとしても、このデータは変更されません。たとえば、PNGファイルのファイルヘッダーは「89504E47」です。
最初に、ファイルデータを読み取ります
public class fileutil {public static string getFileHeader(MultiPartFileファイル){inputStream is = null;文字列値= null; try {is = file.getInputStream(); byte [] b = new byte [4]; is.read(b、0、b.length); value = 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(file)
現時点では、単純な文字列比較を実行し、コールの返信値が「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"); // DIARY 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( "25504462d312e"、 "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 *ファイルパス * @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 *ファイルパス * @returnファイルヘッダー情報 * / public static string getFileHeader(string filepath){fileinputStream is = null;文字列値= null; try {is = new FileInputStream(filepath); byte [] b = new byte [4]; / * * int read()この入力ストリームからデータバイトを読み取ります。 int read(byte [] b)この入力ストリームからのb.length * bytesのバイト配列のデータ配列まで読み取ります。 int read(byte [] b、int off、int len) *この入力ストリームからバイト配列にデータのバイトを読み取ります。 */ is.read(b、0、b.length); value = bytestohexstring(b); } catch(例外e){}最後に{if(null!= is){try {is.close(); } catch(ioexception e){}}} return値; } / ** *ファイルのバイト配列を変換してファイルヘッダー情報を読み取り、ファイルの@param src * @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 ++){// 16進数の整数パラメーターの文字列表現を返します(base 16)unsigned integerにintegase 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)throws exception {final string filetype = getFileType( "d://ry4s_java.dll"); System.out.println(filetype); }}要約します
上記は、SpringbootファイルのアップロードコントロールとJavaの取得および判断ファイルヘッダー情報です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!