Eclipse搭建springboot項目(三)配置文件自動注入+文件上傳需求


知識點1:SpringBoot2.x常見的配置文件 xml、yml、properties的區別和使用xml、properties、json、yaml

  1、常見的配置文件 xx.yml, xx.properties
    1) YAML(Yet Another Markup Language)
      寫 YAML 要比寫 XML 快得多(無需關注標簽或引號)
      使用空格 Space 縮進表示分層,不同層次之間的縮進可以使用不同的空格數目
      注意:key后面的冒號,后面一定要跟一個空格,樹狀結構
      application.properties示例

server.port=8090 
server.session-timeout=30 
server.tomcat.max-threads=0 
server.tomcat.uri-encoding=UTF-8

      application.yml示例

server: 
port: 8090 
session-timeout: 30 
tomcat.max-threads: 0 
tomcat.uri-encoding: UTF-8

  2、默認示例文件僅作為指導。 不要將整個內容復制並粘貼到您的應用程序中,只挑選您需要的屬性。
  3、參考:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#common-application-properties

    如果需要修改,直接復制對應的配置文件,加到application.properties里面

 

知識點2:SpringBoot注解把配置文件自動映射到屬性和實體類實戰

  簡介:講解使用@value注解配置文件自動映射到屬性和實體類
  1、配置文件加載
  方式一
    1、Controller上面配置
      @PropertySource({"classpath:resource.properties"})
    2、增加屬性
      @Value("${test.name}")
      private String name;

  方式二:實體類配置文件
    步驟

    1、添加 @Component 注解;
    2、使用 @PropertySource 注解指定配置文件位置;
    3、使用 @ConfigurationProperties 注解,設置相關屬性;
    4、必須 通過注入IOC對象Resource 進來 , 才能在類中使用獲取的配置文件值。

    @Autowired
    private ServerSettings serverSettings;

  例子:

@Configuration
@ConfigurationProperties(prefix="test")
@PropertySource(value="classpath:resource.properties")
public class ServerConstant {

    用(prefix="test")這種方式時變量不能加@Value("${test.name}")


  常見問題:
    1、配置文件注入失敗,Could not resolve placeholder
    解決:根據springboot啟動流程,會有自動掃描包沒有掃描到相關注解, 默認Spring框架實現會從聲明@ComponentScan所在的類的package進行掃描,來自動注入,因此啟動類最好放在根路徑下面,或者指定掃描包范圍spring-boot掃描啟動類對應的目錄和子目錄。
    2、注入bean的方式,屬性名稱和配置文件里面的key一一對應,就不用加@Value 這個注解,如果不一樣,就要加@value("${XXX}")

 

 

知識點:SpringBoot2.x文件上傳:HTML頁面文件上傳和后端處理

  1、springboot文件上傳 MultipartFile file,源自SpringMVC
    1)靜態頁面直接訪問:localhost:8080/index.html
      注意點:如果想要直接訪問html頁面,則需要把html放在springboot默認加載的文件夾下面
    2)MultipartFile 對象的transferTo方法,用於文件保存(效率和操作比原先用FileOutStream方便和高效)
      訪問路徑 http://localhost:8080/images/39020dbb-9253-41b9-8ff9-403309ff3f19.jpeg

  2、jar包方式運行web項目的文件上傳和訪問處理,SpingBoot2.x使用 java -jar運行方式的圖片上傳和訪問處理(核心知識)

    1)文件大小配置,啟動類里面配置

@Bean 
public MultipartConfigElement multipartConfigElement() { 
    MultipartConfigFactory factory = new MultipartConfigFactory(); 
    //單個文件最大 
    factory.setMaxFileSize("10240KB"); //KB,MB 
    /// 設置總上傳數據總大小 
    factory.setMaxRequestSize("1024000KB"); 
    return factory.createMultipartConfig(); 
}

    2)打包成jar包,需要增加maven依賴,如果沒加相關依賴,執行maven打包,運行后會報錯:no main manifest attribute, in XXX.jar

       GUI:反編譯工具,作用就是用於把class文件轉換成java文件

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>     

    3)文件上傳和訪問需要指定磁盤路徑
      application.properties中增加下面配置
        a) web.images-path=/Users/aaron/Desktop
        b) spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/test/,file:${web.upload-path}

    4)文件服務器:fastdfs,阿里雲oss,nginx搭建一個簡單的文件服務器

一、目錄結構

二、文件上傳需求

1.前端

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>uploading</title>
<meta name="keywords" content="keyword1,keyword2,keyword3"></meta>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<script src="/js/test.js" type="text/javascript"></script>
</head>
<body>
    <form enctype="multipart/form-data" method="post" action="/fileController/upload">
        文件:<input type="file" name="head_img" /> 
        姓名:<input type="text" name="name" /> 
        <input type="submit" value="上傳" />
    </form>
</body>
</html>

2.文件上傳Controller

package net.aaron.demo.controller;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import net.aaron.demo.domain.JsonData;

@Controller
@RequestMapping(value = "fileController")
@PropertySource(value="classpath:application.properties")
public class FileController {
    @Value("${web.filePath}")
    private String filePath;
    @RequestMapping(value = "upload")
    @ResponseBody
    public JsonData upload(@RequestParam("head_img") MultipartFile file, HttpServletRequest request) {
          
         //file.isEmpty(); 判斷圖片是否為空
         //file.getSize(); 圖片大小進行判斷
        
         System.out.println("配置注入打印,文件路徑為:"+filePath);
         
         
         String name = request.getParameter("name");
         System.out.println("用戶名:"+name);
        
         // 獲取文件名
        String fileName = file.getOriginalFilename();            
        System.out.println("上傳的文件名為:" + fileName);
        
        // 獲取文件的后綴名,比如圖片的jpeg,png
        // lastIndexOf 是從右向左查某個指定的字符串在字符串中最后一次出現的位置
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        System.out.println("上傳的后綴名為:" + suffixName);
        
        // 文件上傳后的路徑
        fileName = UUID.randomUUID() + suffixName;
        System.out.println("轉換后的名稱:"+fileName);
        
        File dest = new File(filePath + fileName);
       
     

            try {
                file.transferTo(dest);
                 return new JsonData(0, fileName);
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
              
        return  new JsonData(-1, "fail to save ", null);
    }
    
}

3.返回JsonData類

package net.aaron.demo.domain;

import java.io.Serializable;

public class JsonData implements Serializable {
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    //狀態碼,0表示成功,-1表示失敗
    private int code;
    
    //結果
    private Object data;

    //錯誤描述
    private String msg;
    
    
    public JsonData(int code, Object data) {
        super();
        this.code = code;
        this.data = data;
    }
    
    public JsonData(int code, String msg,Object data) {
        super();
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

}

4.訪問:

5.訪問文件超過限制

報錯:org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field head_img exceeds its maximum permitted size of 1048576 bytes.

解決:在啟動類里面配置文件大小,驗證OK

package net.aaron.demo;

import javax.servlet.MultipartConfigElement;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.util.unit.DataSize;
import org.springframework.util.unit.DataUnit;

@SpringBootApplication
public class AaronSpringbootApplication {



    public static void main(String[] args) {
        SpringApplication.run(AaronSpringbootApplication.class, args);
    }
    
    @Bean 
    public MultipartConfigElement multipartConfigElement() { 
        MultipartConfigFactory factory = new MultipartConfigFactory(); 
        //單個文件最大 
        factory.setMaxFileSize(DataSize.of(10, DataUnit.MEGABYTES)); //KB,MB 
        /// 設置總上傳數據總大小 
        factory.setMaxRequestSize(DataSize.of(1000, DataUnit.MEGABYTES)); 
        return factory.createMultipartConfig(); 
    }

}

注:兩種方式:

  1)配置項方式:

  application.properties

    spring.servlet.multipart.max-file-size=20MB
    spring.servlet.multipart.max-request-size=20MB

 

  2)直接傳參方式

  springboot 1.5.X系列:

/**  
     * 文件上傳配置  
     * @return  
     */  
    @Bean  
    public MultipartConfigElement multipartConfigElement() {  
        MultipartConfigFactory factory = new MultipartConfigFactory();  
        //文件最大  
        factory.setMaxFileSize("10240KB"); //KB,MB  
        /// 設置總上傳數據總大小  
        factory.setMaxRequestSize("102400KB");  
        return factory.createMultipartConfig();  
    }  

  Springboot 2.X系列:

 @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //文件最大10M,DataUnit提供5中類型B,KB,MB,GB,TB
        factory.setMaxFileSize(DataSize.of(10, DataUnit.MEGABYTES));
        /// 設置總上傳數據總大小10M
        factory.setMaxRequestSize(DataSize.of(10, DataUnit.MEGABYTES));
        return factory.createMultipartConfig();
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM