3C科技 娛樂遊戲 美食旅遊 時尚美妝 親子育兒 生活休閒 金融理財 健康運動 寰宇綜合

Zi 字媒體

2017-07-25T20:27:27+00:00
加入好友
文件上傳也是常見的功能,趁著周末,用Spring boot來實現一遍。前端部分前端使用jQuery,這部分並不複雜,jQuery可以讀取表單內的文件,這裡可以通過formdata對象來組裝鍵值對,formdata這種方式發送表單數據更為靈活。你可以使用它來組織任意的內容,比如使用formData.append("test1","hello world");在kotlin後端就可以使用@RequestParam("test1") greet: String來取得他的值。在本例的上傳中,formdata用於裝配上傳表單,就像這樣:function uploadfile { var formData = new FormData; $.each($("input[type='file']")[0].files, function (i, file) { formData.append('upload-file', file); }); $.ajax({ url: "/upload", method: "post", data: formData, processData: false, contentType: false }).done(function (res) { if (res.success) { $("#message").text(res.message + res.files); $("#message").addClass("green") $("#message").removeClass("red") } else { $("#message").text("cannot upload files, reason: " + res.message) $("#message").addClass("red") $("#message").removeClass("green") } }) .fail(function (res) { }) }使用FormData對象,在前端連form標籤都不需要。 其中關於上面代碼的幾點解釋:如果input標籤上使用了multiple,那麼用戶可能選擇多個文件,所以再裝配formdata的時候,需要上面的each循環。contentType: false 設置成false告訴jQuery在header里不要用任何的content type。processData: false:告訴jQuery不用講傳輸內容編碼(因為默認的content type是application/x-www-form-urlencoded)。如我們要發送DOM或確實不需要編碼的對象,就把這個參數設成false。注意:如果不將contentType設置成false,kotlin後端會報異常Current request is not a multipart request如果沒有將processData設成false,javascript會報錯:Uncaught TypeError: Illegal invocation如果要上傳多個文件,在input標籤上設置multiple屬性。後端部分後端準備在上傳完成後,給前端回復一個成功或失敗的信息,為此,創建一個返回的對象:class UploadResult(val success: Boolean, val message: String, val files: Array<String>)success: 告訴前端是否上傳成功message:伺服器端往前端返回的信息,可以包含任意後端想返回的內容,比如今天伺服器所在地天氣不好,所以伺服器打算拒絕非管理員的上傳請求。files:上傳成功了哪些文件。 後端的關鍵代碼:@ResponseBody @PostMapping("upload") fun upload(@RequestPart("upload-file") uploadfile: Array<MultipartFile>): UploadResult { if (uploadfile.count == 0) return UploadResult(false, "the uploading file is not detected.", arrayOf) val dir = env.getProperty("com._1b2m.defaultuploaddir") val f: File = File(dir) if (!f.exists) { f.mkdirs } for (file in uploadfile) { val fileName = file.originalFilename; val filepath: String = Paths.get(dir, fileName).toString val stream: BufferedOutputStream = BufferedOutputStream(FileOutputStream(File(filepath))) stream.write(file.bytes) stream.close } return UploadResult(true, "successfully uploaded your file(s). ", uploadfile.map { it.originalFilename }.toTypedArray) }注意: 在kotlin中的RequestPart("upload-file」),和前端的formData.append('upload-file', file)要保持一致,我這裡用的變數叫upload-file,如果不一致,後端就沒有取到數據了。在這裡我還是要推薦下我自己建的前端學習群:477149581,不說其他的,首先你要是前端黨,不管你是小白還是大牛,小編我都挺歡迎,小白嘛,主動點,勤快點,多問點問題也就學好了,就怕你自己死敲代碼啊,不定期分享乾貨,頭條號內分享的所有酷炫特效源碼都在這,歡迎初學和進階中的小夥伴。最後上一張截圖,圖片上傳成功:

本文由yidianzixun提供 原文連結

寫了 5860316篇文章,獲得 23313次喜歡
精彩推薦