Java文件上傳實例并解決跨域問題

      網(wǎng)友投稿 1008 2025-03-31

      Java文件上傳實例并解決跨域問題


      目錄

      了解MultipartFile接口

      文件上傳業(yè)務(wù)代碼

      Controller類

      Service類:寫了具體的業(yè)務(wù)邏輯

      修改nginx配置,將文件存儲到文件服務(wù)器

      每次上傳文件都會經(jīng)過網(wǎng)關(guān),必然會給網(wǎng)關(guān)帶來很大的壓力,那我們?nèi)绾卫@過網(wǎng)關(guān)呢?

      1.在網(wǎng)關(guān)中配置白名單 ,這樣也會走網(wǎng)關(guān),只是壓力少了一點點

      2.在nginx做轉(zhuǎn)發(fā),當請求文件上傳時,直接轉(zhuǎn)到相應(yīng)的服務(wù)

      解決上傳文件出現(xiàn)跨域問題

      寫配置類CorsFilter

      在nginx配置中配置請求實體大小

      在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳和下載功能是非常常用的功能,今天來講一下JavaWeb中的文件上傳功能的實現(xiàn)。

      了解MultipartFile接口

      我們實現(xiàn)文件的上傳用到了Spring-web框架中的 MultipartFile接口,MultipartFile接口的源碼注釋中說“MultipartFile接口是? 在大部分請求中接收的上載文件的表示形式。”

      A representation of an uploaded file received in a multipart request.

      The file contents are either stored in memory or temporarily on disk. In either case, the user is responsible for copying file contents to a session-level or persistent store as and if desired. The temporary storage will be cleared at the end of request processing.

      Java文件上傳實例并解決跨域問題

      常用方法如下表

      文件上傳業(yè)務(wù)代碼

      Controller類

      /**

      * @Author: 小小張自由

      * @Date: 2021/7/6 - 20:56

      * @Description: 文件上傳

      * @version: 1.0

      */

      @Controller

      @RequestMapping("upload")

      public class UploadController {

      @Autowired

      private UploadService uploadService;

      @PostMapping("image")

      public ResponseEntity uploadImage(@RequestParam("file") MultipartFile file){

      String url= this.uploadService.uploadImage(file);

      if (StringUtils.isBlank(url)){

      return ResponseEntity.badRequest().build();

      }

      return ResponseEntity.status(HttpStatus.CREATED).body(url);

      }

      }

      Service類:寫了具體的業(yè)務(wù)邏輯

      /**

      * @Author: 小小張自由

      * @Date: 2021/7/6 - 21:01

      * @Description: 文件上傳

      * @version: 1.0

      */

      @Service

      public class UploadService {

      //用于判斷文件的類型,暫時只判斷了“image/gif","image/jpeg”

      private static final List CONTENT_TYPES= Arrays.asList("image/gif","image/jpeg");

      private static final Logger LOGGER= LoggerFactory.getLogger(UploadService.class);

      /**

      * 業(yè)務(wù)邏輯代碼

      * @param file 文件的存儲的url

      * @return

      */

      public String uploadImage(MultipartFile file) {

      String originalFilename = file.getOriginalFilename();

      //校驗文件類型

      //方法一:截取字符串

      String afterLast = StringUtils.substringAfterLast(".", originalFilename);

      //方法二:使用getContentType方法

      String contentType = file.getContentType();

      if (!CONTENT_TYPES.contains(contentType)){

      LOGGER.info("文件類型不合法:"+originalFilename);

      return null;

      }

      //校驗文件內(nèi)容

      try {

      //獲取文件流

      BufferedImage bufferedImage = ImageIO.read(file.getInputStream());

      if (bufferedImage==null){

      LOGGER.info("文件內(nèi)容不合法:{}",originalFilename);

      return null;

      }

      //保存到服務(wù)器 E:\Leyou\image

      //將接收到的文件傳輸到給定的目標文件。

      file.transferTo(new File("E:\\Leyou\\Image\\"+originalFilename));

      //返回URL,進行回顯

      //可以使用Nginx-圖片服務(wù)器

      return "http://image.leyou.com/"+originalFilename;

      } catch (Exception e) {

      LOGGER.info("服務(wù)器內(nèi)部錯誤:"+originalFilename);

      e.printStackTrace();

      }

      return null;

      }

      }

      修改nginx配置,將文件存儲到文件服務(wù)器中

      修改Nginx的配置文件nginx.conf,監(jiān)聽80端口,設(shè)置root的值為:E盤

      -?圖片不能保存在服務(wù)器內(nèi)部,這樣會對服務(wù)器產(chǎn)生額外的加載負擔

      -?一般靜態(tài)資源都應(yīng)該使用獨立域名,這樣訪問靜態(tài)資源時不會攜帶一些不必要的cookie,減小請求的數(shù)據(jù)量

      server {

      listen 80;

      server_name image.leyou.com;

      proxy_set_header X-Forwarded-Host $host;

      proxy_set_header X-Forwarded-Server $host;

      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

      location / {

      root E:\\Leyou\\image;

      }

      }

      每次上傳文件都會經(jīng)過網(wǎng)關(guān),必然會給網(wǎng)關(guān)帶來很大的壓力,那我們?nèi)绾卫@過網(wǎng)關(guān)呢?

      1.在網(wǎng)關(guān)中配置白名單 ,這樣也會走網(wǎng)關(guān),只是壓力少了一點點

      @Slf4j

      public class AuthorizeFilter implements GlobalFilter, Ordered {

      //白名單:存放放行的URL

      private List allowPaths;

      @Override

      public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {

      //獲取請求的url路徑

      String path = request.getURI().getPath();

      boolean flag=isAllowPath(path);

      if (flag) {

      log.info("請求在白名單中,leyou.filter: {}",path);

      //放行

      return chain.filter(exchange);

      } else {

      //寫其他的業(yè)務(wù)邏輯

      ~~~~

      }

      }

      private boolean isAllowPath(String path) {

      //判斷是否允許放行

      if (allowPaths.contains(path)){

      return true;

      }

      return false;

      }

      2.在nginx做轉(zhuǎn)發(fā),當請求文件上傳時,直接轉(zhuǎn)到相應(yīng)的服務(wù)

      本實例使用了方法二、需要增加配置

      server {

      listen 80;

      server_name api.leyou.com;

      proxy_set_header X-Forwarded-Host $host;

      proxy_set_header X-Forwarded-Server $host;

      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

      # 新增加的配置,用于文件上傳

      location /api/upload {

      proxy_pass http://127.0.0.1:8082;

      proxy_connect_timeout 600;

      proxy_read_timeout 600;

      rewrite "^/api/(.*)$" /$1 break;

      }

      # 網(wǎng)關(guān)的配置

      location / {

      proxy_pass http://127.0.0.1:10010;

      proxy_connect_timeout 600;

      proxy_read_timeout 600;

      }

      }

      當這樣配置之后,文件上傳就不會過網(wǎng)關(guān),減少了網(wǎng)關(guān)的壓力。但是有引來了一個新問題那就是跨域。

      解決上傳文件出現(xiàn)跨域問題

      由于Nginx將文件上傳的請求直接轉(zhuǎn)發(fā)到了具體服務(wù)中,不再走gateway,所以gateway中的跨域配置,不再生效了。 需要在文件上傳這個服務(wù)中單獨配置跨域。

      寫配置類CorsFilter

      /**

      * @Author: 小小張自由

      * @Date: 2021/6/15 - 11:12

      * @Description: 解決 跨域問題

      * @version: 1.0

      */

      @Configuration

      public class LeyouCorsConfiguration {

      @Bean

      public CorsFilter corsFilter(){

      //初始化配置對象

      CorsConfiguration configuration = new CorsConfiguration();

      //允許跨域訪問的域名

      configuration.addAllowedOrigin("*");

      // configuration.setAllowCredentials(true); //運行攜帶cookie

      configuration.addAllowedMethod("*"); //代表所有請求方法

      configuration.addAllowedHeader("*"); //允許攜帶任何頭信息

      //初始化cors配置源對象

      UrlBasedCorsConfigurationSource configurationSource=new UrlBasedCorsConfigurationSource();

      configurationSource.registerCorsConfiguration("/**",configuration);

      //返回CorSfilter實例,參數(shù)

      return new CorsFilter(configurationSource);

      }

      }

      到此應(yīng)該就可以上傳了,但是還是報跨域,我已經(jīng)配置好了啊,為什么還是報跨域呢?

      在nginx配置中配置請求實體大小

      我就想是不是Nginx的問題,然后我就一行一行的讀配置,最后發(fā)現(xiàn)

      nginx配置中沒有配置請求實體大小

      加上這行配置就好了

      client_max_body_size 1024m;

      如果本篇博客對您有一定的幫助,大家記得留言++哦。

      Java Nginx

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:如何將紙張上面的文字內(nèi)容提取到Word
      下一篇:什么是低代碼開發(fā)平臺(低代碼平臺有哪些)
      相關(guān)文章
      激情小说亚洲图片| 亚洲性69影院在线观看| 91亚洲视频在线观看| 无码乱人伦一区二区亚洲一| 国产亚洲精aa成人网站| 国产精品成人亚洲| 九月婷婷亚洲综合在线| 日韩成人精品日本亚洲| 国产尤物在线视精品在亚洲| 国产亚洲欧美日韩亚洲中文色| 亚洲国产精品无码第一区二区三区| 亚洲国产成人精品无码久久久久久综合| 亚洲乱理伦片在线观看中字 | 亚洲人成自拍网站在线观看| 亚洲xxxx18| 亚洲日韩一区精品射精| 亚洲熟妇丰满xxxxx| 亚洲综合视频在线| 亚洲精品无码久久久久久久| 亚洲欧洲日韩综合| 亚洲影视自拍揄拍愉拍| 最新亚洲精品国偷自产在线| 亚洲精品无播放器在线播放| 久久精品国产亚洲av品善| 激情小说亚洲图片| 国产精品亚洲w码日韩中文| 中文字幕亚洲综合久久男男| 国产亚洲综合久久系列| 久久久久亚洲AV成人无码| 亚洲视频手机在线| 久久亚洲精品专区蓝色区| 亚洲国产精品18久久久久久| 国产亚洲人成在线影院| 久久精品国产亚洲Aⅴ蜜臀色欲| 久久久久亚洲av成人无码电影| 亚洲一区二区三区偷拍女厕| 久久久亚洲精品视频| 亚洲成人福利网站| 亚洲另类无码专区首页| 亚洲精品第一国产综合精品99| 中文字幕亚洲乱码熟女一区二区 |