search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

使用Spring boot + jQuery上傳文件(kotlin)

文件上傳也是常見的功能,趁著周末,用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 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦