Spring Boot 2.0 多圖片上傳加回顯

來源:http://r6f.cn/crEY
這兩天公司有需求讓做一個商戶注冊的后臺功能,其中需要商戶上傳多張圖片并回顯。由于之前沒做過這方面的東西,此篇文章用以記錄一些知識點,以便后續(xù)查看。
Controller的代碼非常簡單,由于用了SpringMVC框架,所以直接用MultipartFile來接即可。由于是多圖片上傳所以用數(shù)組來接。此處應(yīng)該注意參數(shù)名應(yīng)該和中的name值相對應(yīng)
@RequestMapping("/pic")
@ResponseBody
public?ResponseEntity<String> pic(MultipartFile [] pictures) throws Exception {
????ResponseEntity<String> responseEntity =?new?ResponseEntity<>();
????long count = Arrays.asList(pictures).stream().
????????????map(MultipartFile::getOriginalFilename).
????????????filter(String::isEmpty).count();
????if?(count == pictures.length){
????????responseEntity.setCode(ResponseEntity.ERROR);
????????throw?new?NullOrEmptyException("圖片不能同時為空");
????}
????responseEntity.setCode(ResponseEntity.OK);
????responseEntity.setMessage("上傳成功");
????return?responseEntity;
}name值和Controller的參數(shù)名稱是對應(yīng)的class="container">
????<div?class="avatar-upload">
????????<div?class="avatar-edit">
????????????<input?type='file'?name="pictures"?id="imageOne"?accept=".png, .jpg, .jpeg"/>
????????????<label?for="imageOne">label>
????????div>
????????<div?class="avatar-preview">
????????????<div?id="imageOnePreview"
?????????????????style="background-image: url(http://ww3.sinaimg.cn/large/006tNc79ly1g556ca7ovqj30ak09mta2.jpg);">
????????????div>
????????div>
????div>
div>js代碼回顯
function?readURLOne(input)?{
????if?(input.files && input.files[0]) {
????????var?reader =?new?FileReader();
????????reader.onload =?function(e)?{
????????????$('#imageOnePreview').css('background-image',?'url("+e.target.result +")");
????????????$('#imageOnePreview').hide();
????????????$('#imageOnePreview').fadeIn(650);
????????}
????????reader.readAsDataURL(input.files[0]);
????}
}
$("#imageOne").change(function()?{
????readURLOne(this);
});
js代碼上傳
function?getUpload(){
????//獲取form表單中所有屬性 key為name值
????var?formData =?new?FormData($("#picForm")[0]);
????$.ajax({
????????url:?'/pic',
????????type:?'POST',
????????dataType:"json",
????????data: formData,
????????processData:?false,
????????contentType:?false,
????????success:(function(data)?{
????????????window.confirm(data.message);
????????????window.location.reload();
????????}),
????????error:(function(res)?{
????????????alert("失敗");
????????})
????});
}
效果展示
初始頁面如下

上傳完圖片以后回顯為

點擊提交以后可將圖片上傳至后臺
配置上傳圖片的屬性
默認(rèn)情況下只允許上傳1MB以下的圖片,如果要設(shè)置上傳圖片大小。那么需要在配置文件中如下配置
spring:
??servlet:
????multipart:
??????enabled: true
??????max-file-size:?20MB
??????max-request-size:?20MB
關(guān)于文件的配置有下面幾個
spring.servlet.multipart.enabled=true?# 是否支持多文件上傳
spring.servlet.multipart.file-size-threshold=0B?# 文件寫入磁盤的閾值
spring.servlet.multipart.location=?# 上傳文件的保存地址
spring.servlet.multipart.max-file-size=1MB?# 上傳文件的最大值
spring.servlet.multipart.max-request-size=10MB?# 請求的最大值
spring.servlet.multipart.resolve-lazily=false?# 是否在文件或參數(shù)訪問時延遲解析多部分請求
異常處理
異常處理用了Springboot提供的全局異常處理機制。只需要在類上加入@ControllerAdvice注解即可。在方法上加入@ExceptionHandler(想要攔截的異常類)就能攔截所有Controller的異常了。如果想要攔截指定為特定的Controller只需要在@ControllerAdvice(basePackageClasses=想要攔截的Controller)
@ControllerAdvice
@Slf4j
public?class?CommonExceptionHandler?extends?ResponseEntityExceptionHandler {
????@ExceptionHandler(NullOrEmptyException.class)
????@ResponseBody
????public?ResponseEntity<String> nullOrEmptyExceptionHandler(HttpServletRequest request, NullOrEmptyException exception){
????????log.info("nullOrEmptyExceptionHandler");
????????return?handleErrorInfo(request, exception.getMessage());
????}
????@ExceptionHandler(value = Exception.class)
????@ResponseBody
????public?ResponseEntity<String> defaultErrorHandler(HttpServletRequest request, Exception exception){
????????log.info("defaultErrorHandler");
????????return?handleErrorInfo(request, exception.getMessage());
????}
????private?ResponseEntity<String> handleErrorInfo(HttpServletRequest request,?String?message) {
????????ResponseEntity<String> responseEntity =?new?ResponseEntity<>();
????????responseEntity.setMessage(message);
????????responseEntity.setCode(ResponseEntity.ERROR);
????????responseEntity.setData(message);
????????responseEntity.setUrl(request.getRequestURL().toString());
????????return?responseEntity;
????}
}
遇到的坑
如果返回值是模板文件的文件名,那么無論是類上還是方法上都不能加@ResponseBody注解,因為如果加了的話會被解析成Json串返回。 注意前端所傳參數(shù)名和后端接收參數(shù)名一一對應(yīng)。不然會報405錯誤 使用IDEA開發(fā)如果使用了lombok那么需要在Annotation Processors中將Enable annotation processing打?qū)?/span>
完整代碼地址
https://github.com/modouxiansheng/Doraemon/tree/master/springdemo
往期推薦
最后,推薦一個專注分享后端面試要點的公眾號「后端面試那些事兒」,置頂標(biāo)星。每日一篇常問的面試問題,秀的一批~掃描下方二維碼關(guān)注!
評論
圖片
表情
