一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java實例講解文件上傳與跨域問題

Java實例講解文件上傳與跨域問題

2021-12-20 13:53小小張自由—>張有博 Java教程

這篇文章主要介紹了Java文件上傳與跨域問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

目在Web應用系統開發中,文件上傳和下載功能是非常常用的功能,今天來講一下JavaWeb中的文件上傳功能的實現。

了解MultipartFile接口

我們實現文件的上傳用到了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.

常用方法如下表

 

Method Summary
byte[] 獲取文件的字節數組 getBytes()
Return the contents of the file as an array of bytes.
String 獲取文件的類型 getContentType()
Return the content type of the file.
InputStream 獲取文件的輸入流 getInputStream()
Return an InputStream to read the contents of the file from.
String 獲取文件名 getName()
Return the name of the parameter in the multipart form.
String 獲取原始文件名(防止篡改文件類型) getOriginalFilename()
Return the original filename in the client's filesystem.
long 獲取文件的大小,以字節的形式) getSize()
Return the size of the file in bytes.
boolean 判斷文件是否為空 isEmpty()
Return whether the uploaded file is empty, that is, either no file has been chosen in the multipart form or the chosen file has no content.
void 將接收到的文件傳輸到給定的目標文件。 transferTo(File dest)
Transfer the received file to the given destination file.

 

文件上傳業務代碼

Controller類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * @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<String> 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類

寫了具體的業務邏輯

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
 * @Author: 小小張自由
 * @Date: 2021/7/6 - 21:01
 * @Description: 文件上傳
 * @version: 1.0
 */
@Service
public class UploadService {
 
    //用于判斷文件的類型,暫時只判斷了“image/gif","image/jpeg”
    private static final List<String> CONTENT_TYPES= Arrays.asList("image/gif","image/jpeg");
 
    private static final Logger LOGGER= LoggerFactory.getLogger(UploadService.class);
 
    /**
     * 業務邏輯代碼
     * @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;
        }
        //校驗文件內容
        try {
            //獲取文件流
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            if (bufferedImage==null){
                LOGGER.info("文件內容不合法:{}",originalFilename);
                return null;
            }
            //保存到服務器   E:\Leyou\image
            //將接收到的文件傳輸到給定的目標文件。
            file.transferTo(new File("E:\\Leyou\\Image\\"+originalFilename));
            
            //返回URL,進行回顯
            //可以使用Nginx-圖片服務器
            return "http://image.leyou.com/"+originalFilename;
        } catch (Exception e) {
            LOGGER.info("服務器內部錯誤:"+originalFilename);
            e.printStackTrace();
        }
        return null;
    }
}

修改nginx配置

將文件存儲到文件服務器中

修改Nginx的配置文件nginx.conf,監聽80端口,設置root的值為:E盤

- 圖片不能保存在服務器內部,這樣會對服務器產生額外的加載負擔
一般靜態資源都應該使用獨立域名,這樣訪問靜態資源時不會攜帶一些不必要的cookie,減小請求的數據量

?
1
2
3
4
5
6
7
8
9
10
11
12
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;
        }
    }

如何繞過網關

每次上傳文件都會經過網關,必然會給網關帶來很大的壓力,那我們如何繞過網關呢?

1.在網關中配置白名單

在網關中配置白名單,這樣也會走網關,只是壓力少了一點點

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Slf4j
public class AuthorizeFilter implements GlobalFilter, Ordered {
 
    //白名單:存放放行的URL
    private List<String> allowPaths;
 
 
    @Override
    public Mono<Void> 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 {
          //寫其他的業務邏輯
            ~~~~
            
        }
    }
 
    private boolean isAllowPath(String path) {
     
          //判斷是否允許放行
         if (allowPaths.contains(path)){
             return true;
         }
         return  false;
 
  }

2.在nginx做轉發

在nginx做轉發,當請求文件上傳時,直接轉到相應的服務

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
    }
    # 網關的配置
    location / {
        proxy_pass http://127.0.0.1:10010;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
    }
}

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

解決上傳文件出現跨域問題

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

寫配置類CorsFilter

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 * @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實例,參數
        return new CorsFilter(configurationSource);
    }
 
}

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

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

我就想是不是Nginx的問題,然后我就一行一行的讀配置,最后發現

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

Java實例講解文件上傳與跨域問題

加上這行配置就好了

?
1
client_max_body_size 1024m;

到此這篇關于Java實例講解文件上傳與跨域問題的文章就介紹到這了,更多相關Java文件上傳跨域內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/promsing/article/details/120089365

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 99热碰 | 亚洲AV无码国产精品色午夜情 | 国产免费又粗又猛又爽视频国产 | 国产a不卡片精品免费观看 国产aaa伦理片 | 性色AV一区二区三区V视界影院 | 国产99精品视频 | 香蕉97超级碰碰碰免费公 | 精品女同一区二区三区免费站 | 久久艹综合 | 99热久久这里只有精品23 | 99成人国产精品视频 | 蜜桃88av| 国产高清精品自在久久 | 免费亚洲视频 | 恩爱夫妇交换小说 | 精品视频在线免费观看 | 欧洲肥女大肥臀tv | 69av导航| 成人免费国产欧美日韩你懂的 | 精品无人乱码一区二区三区 | 2021最新国产成人精品免费 | 国产小嫩模好紧 | 公共场合高h短篇 | 日韩精品亚洲专区在线影视 | 成人精品一区二区三区中文字幕 | 99国产精品热久久久久久夜夜嗨 | 久久久亚洲国产精品主播 | 九九精品成人免费国产片 | 爽好舒服快想要免费看 | 欧美精品v日韩精品v国产精品 | 13日本xxxxxxxxx18 1313午夜精品久久午夜片 | 精品一区二区三区高清免费不卡 | chinese男gay飞机同志 | 我的妹妹最近有点怪免费播放 | 日韩去日本高清在线 | 激情视频激情小说 | 国产91第一页 | 色婷婷久久综合中文久久一本` | 久久两性视频 | 国产主播99 | 国产精品一区二区久久 |