SpringBoot利用Nginx作为文件服务器实现文件上传和访问

本来使用springboot做的文件上传本地测试没问题,但是后端部署到公司的服务器以后,前后端联调就会上传文件后,根据返回路径访问不到图片(linux并不会让你直接根据域名/路径/文件名 的方式获取资源)。解决办法:使用nginx反向代理。

1.提前在服务器的nginx配置


    server {
        listen       80;
        server_name  域名;

        location / {
            root   html;
            index  index.html index.htm;
        }

		#以下为我添加的配置
        location ~ .(jpg|png|jpeg|gif|bmp)$ {   #可识别的文件后缀
            root /usr/local/webserver/nginx/image/;     #图片的映射路径
            autoindex on;       #开启自动索引
           # expires 1h;         #过期时间
        }
        #至此结束

    }

简单的说就是nginx监听了80端口,只要是.(jpg|png|jpeg|gif|bmp)结尾的url都会去/usr/local/webserver/nginx/image/下面找对应的文件。

2.项目配置文件

#文件上传配置
spring.servlet.multipart.enabled=true
#单个文件最大大小
spring.servlet.multipart.max-file-size=30MB
#一次请求文件最大大小
spring.servlet.multipart.max-request-size=100MB
#文件保存路径
#linux下文件的上传路径
file.upload.path=/usr/local/webserver/nginx/image/
#文件访问路径
file.coming.path=http://ip:nginx监听的端口/

3.后端文件上传接口

import cn.anson.AdminAnsonApplication;
import cn.anson.model.Result;
import cn.anson.model.ResultCodeEnum;
import cn.anson.model.vo.UploadVO;
import cn.anson.utils.MyException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

/**
 * @author yhd
 * @createtime 2020/10/11 16:40
 */
@CrossOrigin
@Slf4j
@RestController
@RequestMapping("/api/img")
public class ImgUpLoadController {

    @Value("${file.upload.path}")
    private String fileSavePath;

    @Value("${file.coming.path}")
    private String fileComingPath;

    @PostMapping("upload")
    public Result<UploadVO> updloadImg(MultipartFile upload,HttpServletRequest request){
        try {

            //获取文件上传路径
            String path = fileSavePath;
            log.info("文件上传路径为:"+path);
            File file = new File(path);
            //判断不存在该目录就创建
            if (!file.exists()){
                file.mkdirs();
            }
            //获取文件名
            String filename = upload.getOriginalFilename();
            log.info(filename);
            //起别名
            String s = UUID.randomUUID().toString().replace("-", "").toUpperCase();
            filename=s+filename;
            //开始上传
            upload.transferTo(new File(file,filename));

            UploadVO uploadVO = new UploadVO();
            uploadVO.setFileName(fileComingPath+filename);
            log.info("最终文件的访问路径:"+uploadVO.getFileName());
            return Result.ok(uploadVO);
        } catch (IOException e) {
            log.error("图片上传失败"+upload.getOriginalFilename());
            throw new MyException(ResultCodeEnum.SERVICE_ERROR);
        }
    }
}

4.使用postMan测试

{
    "code": 200,
    "message": "成功",
    "data": {
        "fileName": "http://ip:nginx监听的端口/57A05F7EC8524363962403F1C539FD2Atimg.jpg"
    },
    "ok": true
}

点击访问这个路径
在这里插入图片描述
成功访问到。

补充:pom.xml

        <!-- Apache工具组件 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.6</version>
        </dependency>
        <!-- 文件上传组件 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.3</version>
        </dependency>

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值