springboot上传图片后访问图片的几种方式

springboot上传图片后访问图片的几种方式

  • 图片存储在本地磁盘,实现WebMvcConfigurer 接口添加本地静态资源访问过滤
  • 图片存储在本地磁盘,nginx动静分离
  • 分布式文件系统minio(对象存储 OSS )
  • 分布式文件系统FastDFS

方式一

所需依赖

 <dependency>
 	<groupId>org.springframework.boot</groupId>
 	<artifactId>spring-boot-starter-web</artifactId>
 </dependency>

yml设置上传文件限制

spring:
  # 上传文件总的最大值
  servlet:
    multipart:
      max-request-size: 10MB
      # 单个文件的最大值
      max-file-size: 5MB

简单上传文件代码

import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@RestController
public class TestController {

    @PostMapping("/upload")
    @ApiOperation(value = "上传文件")
    public String upload(@RequestParam("file") MultipartFile file) {
        // 文件名
        String fileName = file.getOriginalFilename();
        // // 保存图片的地址
        String filePath = "F:\\img\\";
        try {
            file.transferTo(new File(filePath + fileName));
            return "上传成功";
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传失败!";
    }

}

postman上传测试

在这里插入图片描述

图片上传至本地 F:\img\

在这里插入图片描述

添加本地静态资源访问过滤

@Configuration
public class HttpConverterConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //其中image表示访问的前缀。"file:F:/img/"是文件真实的存储路径
        registry.addResourceHandler("/image/**").addResourceLocations("file:F:/img/");
    }

}

访问本地图片成功

在这里插入图片描述
注意:文件名称带有中文的或者特殊字符的

方式一:拦截器配置:

	/**
     * 更改程序映射请求路径默认策略*/
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper=new UrlPathHelper();
        urlPathHelper.setUrlDecode(false);
        urlPathHelper.setDefaultEncoding(StandardCharsets.UTF_8.name());
        configurer.setUrlPathHelper(urlPathHelper);
    }
方式二:yml配置(推荐)
spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

方式二通过Nginx动静分离访问图片

链接: 在windows上安装Nginx参考.

简单动静分离配置

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #access_log  logs/access.log  main;

    sendfile        on;
	
	keepalive_timeout  65;

    #tcp_nopush     on;
	
	#是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
    gzip  on;
	
	#为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
	gzip_disable "msie6";

	#upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器	
	upstream tomcatserver1 {
	   server localhost:8080;
	   #server localhost:8081;
	}

    server {
        listen       80;
        server_name  127.0.0.1;

        # 用于设置www/路径中配置的网页的默认编码格式
        charset       utf-8;
		# 静态资源地址
		location ~ \.(html|js|css|png|gif|img|jpg)$ {
            root   D:\img;
        }
		
        #反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化
		location / {
		    proxy_pass    http://tomcatserver1;
		    proxy_set_header        Host            $host;
                    proxy_set_header        X-Real-IP       $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                    client_max_body_size 10m; 
                    client_body_buffer_size 128k; 
                    proxy_connect_timeout 90; 
                    proxy_send_timeout 90; 
                    proxy_read_timeout 90; 
                    proxy_buffer_size 4k; 
                    proxy_buffers 4 32k; 
                    proxy_busy_buffers_size 64k; 
                    proxy_temp_file_write_size 64k;
		}

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }

}

访问后端接口

在这里插入图片描述

访问图片在这里插入图片描述

访问不到文件可能是配置静态资源过滤出错,注意文件格式

方式三通过minio(对象存储 OSS )访问图片

链接: springboot整合Minio(十一)-搭建自己的OSS(云存储服务).

方式四通过分布式图片服务器FastDFS访问图片(待续)

### Spring Boot 实现图片上传到 Nginx 的配置教程及示例 #### 一、Nginx 配置 为了支持图片上传功能,需要在 Nginx 中设置一个专门用于存储文件的路径。以下是具体的 Nginx 配置方法: 编辑 `nginx.conf` 文件,通常位于 `/etc/nginx/nginx.conf` 或者 `/usr/local/nginx/conf/nginx.conf` 路径下[^1]。 ```nginx server { listen 80; server_name yourdomain.com; location /upload/ { alias /var/www/upload/; autoindex on; # 可选:允许浏览目录结构 } location /api/ { proxy_pass http://localhost:8080; # 假设Spring Boot运行在本地8080端口上 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` 上述配置中定义了一个名为 `/upload/` 的虚拟路径,指向实际的磁盘位置 `/var/www/upload/`。此路径将被用来保存通过 API 接收的文件[^3]。 完成配置后记得重启 Nginx 服务以使更改生效: ```bash sudo systemctl restart nginx ``` --- #### 二、Spring Boot 后端处理逻辑 在 Spring Boot 应用程序中创建控制器来接收前端传来的文件数据并将其写入指定的目标路径。 ##### 添加依赖项 确保项目的 `pom.xml` 文件中有以下 Maven 依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` ##### 创建 Controller 类 下面展示的是如何编写一个简单的 RESTful 控制器来接受 multipart/form-data 请求并将接收到的文件保存下来。 ```java import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; @RestController @RequestMapping("/api/files") public class FileUploadController { private static final String UPLOAD_DIR = "/var/www/upload/"; @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return "Failed to upload empty file."; } try { byte[] bytes = file.getBytes(); File targetFile = new File(UPLOAD_DIR + file.getOriginalFilename()); targetFile.createNewFile(); // 如果目标文件不存在,则新建它 java.nio.file.Files.write(targetFile.toPath(), bytes); return "You successfully uploaded '" + file.getOriginalFilename() + "'!"; } catch (IOException e) { e.printStackTrace(); return "Error occurred while uploading the file."; } } } ``` 注意这里的 `UPLOAD_DIR` 必须与之前 Nginx 所设定的一致[^4]。 --- #### 三、安全性考虑 当涉及到文件上传时,安全问题是不可忽视的一部分。建议采取措施防止恶意攻击比如 XSS CSRF 攻击以及非法访问控制等问题的发生。 可以通过验证 MIME 类型或者限制最大允许大小等方式增强系统的健壮性安全性。 --- #### 四、测试过程 最后一步就是确认整个流程是否正常运作了。可以利用 Postman 工具发起 POST 请求来进行初步的功能检测;当然也可以开发对应的前端页面让用户更方便地执行这一操作。 假设已经成功部署好环境之后,在浏览器地址栏键入类似于这样的 URL 地址即可查看刚刚上传上去的内容是否存在: ``` http://yourdomain.com:8081/upload/<filename> ``` 其中 `<filename>` 是指代刚才所上传的那个具体文档的名字。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值