MultipartFile上傳圖片儲存伺服器

welloffG發表於2020-11-27

在這裡插入圖片描述
選擇了圖片後在旁邊顯示
在這裡插入圖片描述

程式碼

  <form class="form-horizontal" th:action="@{/faceRecognit/save}" method="post" enctype="multipart/form-data">
     <div class="fileupload fileupload-new" data-provides="fileupload">
                    <div style=" float:left; ">
                        <span class="btn btn-theme02 btn-file">
                          <span class="btn btn-success">選擇圖片</span>
                          <input class="default" name="pic" multiple="multiple" type="file" data-show-caption="true"/>
                        </span>
                      </div>
                      <div class="fileupload-new thumbnail" style="float:left; width: 400px; height: 150px;">
                          <img th:src="${faceRecognitInfo==null}?@{/img/NOimage.png}:@{${faceRecognitInfo.image}}" alt="圖片載入失敗..." />
                      </div>
                      <div class="fileupload-preview fileupload-exists thumbnail" style="max-width: 400px; max-height: 150px; line-height: 20px;"></div>
                     
                    </div>
     <button type="submit" class="btn btn-primary">提交</button>
        </form>

重點是要引入這個js,這個封裝好了,相應的div的class不要刪掉,不然選擇圖片後是沒辦法顯示在旁邊的,如果不需要顯示旁邊,你可以不引入也能儲存。

<script src="/vendor/bootstrap-fileupload/bootstrap-fileupload.js"></script>
/* ===========================================================
 * bootstrap-fileupload.js j2
 * http://jasny.github.com/bootstrap/javascript.html#fileupload
 * ===========================================================
 * Copyright 2012 Jasny BV, Netherlands.
 *
 * Licensed under the Apache License, Version 2.0 (the "License")
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================== */

!function ($) {

  "use strict"; // jshint ;_

 /* FILEUPLOAD PUBLIC CLASS DEFINITION
  * ================================= */

  var Fileupload = function (element, options) {
    this.$element = $(element)
    this.type = this.$element.data('uploadtype') || (this.$element.find('.thumbnail').length > 0 ? "image" : "file")
      
    this.$input = this.$element.find(':file')
    if (this.$input.length === 0) return

    this.name = this.$input.attr('name') || options.name

    this.$hidden = this.$element.find('input[type=hidden][name="'+this.name+'"]')
    if (this.$hidden.length === 0) {
      this.$hidden = $('<input type="hidden" />')
      this.$element.prepend(this.$hidden)
    }

    this.$preview = this.$element.find('.fileupload-preview')
    var height = this.$preview.css('height')
    if (this.$preview.css('display') != 'inline' && height != '0px' && height != 'none') this.$preview.css('line-height', height)

    this.original = {
      'exists': this.$element.hasClass('fileupload-exists'),
      'preview': this.$preview.html(),
      'hiddenVal': this.$hidden.val()
    }
    
    this.$remove = this.$element.find('[data-dismiss="fileupload"]')

    this.$element.find('[data-trigger="fileupload"]').on('click.fileupload', $.proxy(this.trigger, this))

    this.listen()
  }
  
  Fileupload.prototype = {
    
    listen: function() {
      this.$input.on('change.fileupload', $.proxy(this.change, this))
      $(this.$input[0].form).on('reset.fileupload', $.proxy(this.reset, this))
      if (this.$remove) this.$remove.on('click.fileupload', $.proxy(this.clear, this))
    },
    
    change: function(e, invoked) {
      var file = e.target.files !== undefined ? e.target.files[0] : (e.target.value ? { name: e.target.value.replace(/^.+\\/, '') } : null)
      if (invoked === 'clear') return
      
      if (!file) {
        this.clear()
        return
      }
      
      this.$hidden.val('')
      this.$hidden.attr('name', '')
      this.$input.attr('name', this.name)

      if (this.type === "image" && this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match('image.*') : file.name.match('\\.(gif|png|jpe?g)$')) && typeof FileReader !== "undefined") {
        var reader = new FileReader()
        var preview = this.$preview
        var element = this.$element

        reader.onload = function(e) {
          preview.html('<img src="' + e.target.result + '" ' + (preview.css('max-height') != 'none' ? 'style="max-height: ' + preview.css('max-height') + ';"' : '') + ' />')
          element.addClass('fileupload-exists').removeClass('fileupload-new')
        }

        reader.readAsDataURL(file)
      } else {
        this.$preview.text(file.name)
        this.$element.addClass('fileupload-exists').removeClass('fileupload-new')
      }
    },

    clear: function(e) {
      this.$hidden.val('')
      this.$hidden.attr('name', this.name)
      this.$input.attr('name', '')

      //ie8+ doesn't support changing the value of input with type=file so clone instead
      if($.browser.msie){
          var inputClone = this.$input.clone(true);
          this.$input.after(inputClone);
          this.$input.remove();
          this.$input = inputClone;
      }else{
          this.$input.val('')
      }

      this.$preview.html('')
      this.$element.addClass('fileupload-new').removeClass('fileupload-exists')

      if (e) {
        this.$input.trigger('change', [ 'clear' ])
        e.preventDefault()
      }
    },
    
    reset: function(e) {
      this.clear()
      
      this.$hidden.val(this.original.hiddenVal)
      this.$preview.html(this.original.preview)
      
      if (this.original.exists) this.$element.addClass('fileupload-exists').removeClass('fileupload-new')
       else this.$element.addClass('fileupload-new').removeClass('fileupload-exists')
    },
    
    trigger: function(e) {
      this.$input.trigger('click')
      e.preventDefault()
    }
  }

  
 /* FILEUPLOAD PLUGIN DEFINITION
  * =========================== */

  $.fn.fileupload = function (options) {
    return this.each(function () {
      var $this = $(this)
      , data = $this.data('fileupload')
      if (!data) $this.data('fileupload', (data = new Fileupload(this, options)))
      if (typeof options == 'string') data[options]()
    })
  }

  $.fn.fileupload.Constructor = Fileupload


 /* FILEUPLOAD DATA-API
  * ================== */

  $(function () {
    $('body').on('click.fileupload.data-api', '[data-provides="fileupload"]', function (e) {
      var $this = $(this)
      if ($this.data('fileupload')) return
      $this.fileupload($this.data())
      
      var $target = $(e.target).is('[data-dismiss=fileupload],[data-trigger=fileupload]') ?
        $(e.target) : $(e.target).parents('[data-dismiss=fileupload],[data-trigger=fileupload]').first()
      if ($target.length > 0) {
          $target.trigger('click.fileupload')
          e.preventDefault()
      }
    })
  })

}(window.jQuery);

後臺


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ClassUtils;
import org.springframework.web.multipart.MultipartFile;

public class PhotoUtil {
	private static Logger logger = LoggerFactory.getLogger(PhotoUtil.class);
	/**
	 * @Title: 
	 * @Description: 儲存圖片
	 * @param dataString時間戳
	 * @param staticPath靜態資源路徑
	 * @return 
	 * @throws
	 */
	public static String savePhoto(MultipartFile multipartFile, Long dataString, String staticPath) {
		// 獲取專案的地址,這個路徑首先要你在伺服器那邊建好
		String realPath = ClassUtils.getDefaultClassLoader().getResource("static").getPath() + staticPath;
		//為了不重複,時間戳作為圖片名稱
		String fileNameString = dataString + ".jpg";
		File savedFile = new File(realPath, fileNameString);
		logger.info("儲存圖片--------->" + savedFile.getPath());
		try {
			FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), savedFile);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return staticPath + fileNameString;
	}
}

	/**
	 * @Title: 
	 * @Description: 儲存註冊資訊
	 * @param
	 * @return 
	 * @throws
	 */
	@PostMapping(value = "/save")
	public String addCustomerInfo(@RequestParam("pic") MultipartFile files, FaceRecognitInfo faceRecognitInfo,
			HttpSession session) throws Exception {
		Date createTime = GetDateUtil.getDateTime2();
		Date date = (Date) GetDateUtil.parseDate2(GetDateUtil.getDateTime(createTime));
		faceRecognitInfo.setCreateTime(createTime);
		faceRecognitInfo.setDate(date);
		if (files != null) {
			long time = createTime.getTime();
			if (files != null && !files.isEmpty()) {
				MultipartFile multipartFile = files;
				//儲存圖片並返回圖片的路徑
				String outname = PhotoUtil.savePhoto(multipartFile, time, "/img/customerpic/");
				//路徑儲存到資料庫
				faceRecognitInfo.setImage(outname);
			}
		}
		faceRecognitMapper.save(faceRecognitInfo);
		return "redirect:/faceRecognit/show";
	}

資料庫中儲存的地址
在這裡插入圖片描述

這時候就儲存完了,下面是返回頁面顯示了,我的html頁面是faceRecognitList.html

	@GetMapping("/show")
	public String customerList(Model model, @RequestParam(value = "pageIndex", defaultValue = "1") Integer pageIndex,
			@RequestParam(value = "keyname", required = false) String keyname) {
		List<FaceRecognitInfo> faceRecognitlist = new ArrayList<>();
		PageHelper.startPage(pageIndex, 10);
		if (!StringUtils.isEmpty(keyname)) {
			faceRecognitlist = faceRecognitMapper.getByLikeName(keyname);
		} else {
			faceRecognitlist = faceRecognitMapper.getAll();
		}
		System.out.println(faceRecognitlist.toString());
		model.addAttribute("faceRecognitlist", faceRecognitlist);
		PageInfo pageInfo = new PageInfo(faceRecognitlist, 3);
		PageUtil.getPageMsg(model, pageInfo);
		return "faceRecognitList";
	}

後臺把查詢到內容包括圖片路徑放到model中直接返回頁面,頁面用了themleaf模板來顯示

   <div class="fileupload-new thumbnail">
                          <img th:src="@{${customer.image}}" alt="" style="width: 150px; height: 150px;" />
                        </div>

在這裡插入圖片描述
在這裡插入圖片描述

相關文章