返回顶部
首页 > 资讯 > 后端开发 > Python >Java实例讲解文件上传与跨域问题
  • 719
分享到

Java实例讲解文件上传与跨域问题

2024-04-02 19:04:59 719人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录了解MultipartFile接口文件上传业务代码Controller类Service类修改Nginx配置如何绕过网关1.在网关中配置白名单2.在nginx做转发解决上传文件出现

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类



@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类

写了具体的业务逻辑



@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);
 
    
    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,减小请求的数据量


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.在网关中配置白名单

在网关中配置白名单,这样也会走网关,只是压力少了一点点


@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做转发,当请求文件上传时,直接转到相应的服务

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


	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



@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配置中没有配置请求实体大小

image.jpg

加上这行配置就好了


client_max_body_size 1024m;

到此这篇关于Java实例讲解文件上传与跨域问题的文章就介绍到这了,更多相关Java文件上传跨域内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实例讲解文件上传与跨域问题

本文链接: https://lsjlt.com/news/134698.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java实例讲解文件上传与跨域问题
    目录了解MultipartFile接口文件上传业务代码Controller类Service类修改nginx配置如何绕过网关1.在网关中配置白名单2.在nginx做转发解决上传文件出现...
    99+
    2024-04-02
  • HttpsURLConnection上传文件流(实例讲解)
    项目需要对接外部接口,将图片文件流发送到外部接口,下面代码就是HttpsURLConnection如何上传文件流: public static void main(String[] args) throws Exception { ...
    99+
    2023-05-31
    httpsurlconnection 上传文件 sur
  • Spring Boot 如何解决富文本上传图片跨域问题
    目录Spring Boot 解决富文本上传图片跨域创建一个WebMvcConfig类创建一个Filter类,做页面跨域的处理springboot文件上传跨域前端后端Spring Bo...
    99+
    2024-04-02
  • SpringMVC 单文件上传与多文件上传实例
    一、简述一个javaWeb项目中,文件上传功能几乎是必不可少的,本人在项目开发中也时常会遇到,以前也没怎么去理它,今天有空学习了一下这方面的知识,于是便将本人学到的SpringMVC中单文件与多文件上传这部分知识做下笔记。二、单文件上传1、...
    99+
    2023-05-31
    springmvc 文件上传 多文件上传
  • Jquery如何实现跨域异步上传文件
    这篇文章主要为大家展示了“Jquery如何实现跨域异步上传文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Jquery如何实现跨域异步上传文件”这篇文章吧。先...
    99+
    2024-04-02
  • gulp解决跨域的配置文件问题
    废话不多说,直接上代码 //引入插件 var gulp = require('gulp'); // var Proxy = require('gulp-connect-proxy'); var conn...
    99+
    2022-06-04
    配置文件 gulp
  • PHP之修改php.ini文件上传大小的配置问题案例讲解
    php.ini php.ini文件保存了php的一些重要属性,例如现在要说的文件上传的一些限制条件,关于php.ini,有一篇很好的介绍:php.ini文件详解,在Windows系统...
    99+
    2024-04-02
  • Java跨域问题分析与解决方法详解
    目录一、前言二、什么是跨域问题三、 为什么会出现跨域问题四、什么情况下会出现跨域五、如何解决跨域问题5.1 使用@CrossOrigin注解5.2 使用WebMvcConfigure...
    99+
    2023-05-20
    Java跨域问题原理 Java跨域问题解决方法 Java跨域问题
  • SpringBoot跨域问题的解决方法实例
    谈到跨域问题,首先我们要认识一下浏览器的同源策略 百度百科对同源策略的解释 当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面 当浏览器的百度tab页执行一个脚本的时候会检查...
    99+
    2024-04-02
  • 解决springcloud阿里云OSS文件访问跨域问题的实现
    目录引言解决引言 最近在高德地图中引用阿里云OSS存储的图片时,出现跨域访问问题,特此记录,以方便后续同学参考 解决 1、在阿里云OSS后台管理中,进入权限管理,进入跨域设置,添加跨...
    99+
    2024-04-02
  • gulp如何解决跨域的配置文件问题
    这篇文章主要介绍gulp如何解决跨域的配置文件问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码//引入插件 var gulp = require(...
    99+
    2024-04-02
  • php上传中文文件无法上传问题怎么解决
    php上传中文文件无法上传的解决办法:1、通过“iconv("GBK", "UTF-8", $content);”方法将中文字符编码转换一下;2、将文件重命名即可。本教程操作环境:Windo...
    99+
    2023-05-14
    php 文件
  • 如何解决layui上传文件提示上传异常,实际文件已经上传成功的问题
    这篇文章给大家分享的是有关如何解决layui上传文件提示上传异常,实际文件已经上传成功的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。layui上传文件提示上传异常,实际文件...
    99+
    2024-04-02
  • 如何解决springcloud阿里云OSS文件访问跨域问题
    本篇内容介绍了“如何解决springcloud阿里云OSS文件访问跨域问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!解决在阿里云OSS后...
    99+
    2023-07-02
  • 怎么使用Jquery插件实现跨域异步上传文件功能
    这篇文章主要介绍“怎么使用Jquery插件实现跨域异步上传文件功能”,在日常操作中,相信很多人在怎么使用Jquery插件实现跨域异步上传文件功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Jquer...
    99+
    2023-07-04
  • web前端大文件上传与下载问题怎么解决
    这篇文章主要介绍了web前端大文件上传与下载问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇web前端大文件上传与下载问题怎么解决文章都会有所收获,下面我们一起来看看吧。一、问题日常业务中难免出现前端...
    99+
    2023-07-04
  • Java中用Socket实现HTTP文件上传实例
    我想做过web开发的程序员大部分都做过文件上传的功能,大多数时候我们都是借助于commons-fileupload这样的jar包实现的。下面我试着通过读取Socket的输入流来实现一个文件上传的功能。在做文件上传之前我们需要先了解一下HTT...
    99+
    2023-05-31
    socket 文件上传 ava
  • 如何使用Html5实现异步上传文件,支持跨域,带有上传进度条
    这篇文章主要为大家展示了“如何使用Html5实现异步上传文件,支持跨域,带有上传进度条”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Html5实现异步上...
    99+
    2024-04-02
  • SpringMVC深入讲解文件的上传下载实现
    目录SpringMVC文件下载SpringMVC文件上传1.基本介绍2.需求分析/图解3.应用实例4.Debug-file.transferTo(目标文件)SpringMVC文件下载...
    99+
    2024-04-02
  • 如何解决IE9 elementUI文件上传的问题
    小编给大家分享一下如何解决IE9 elementUI文件上传的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问题: IE9中...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作