nginx-图片等静态资源访问解决方案

前言

前后端分离项目,或者是更一般的web项目,都有部分业务需要进行图片的展示。比如在列表中显示各种数据的图片,或是用户头像上传,甚至需要上传后回显。利用nginx是现在较为通用的解决方案。

目录

  1. 图片保存和显示的方式
  2. 配置nginx
  3. 前端逻辑
  4. 后端逻辑

1.图片保存和显示的方式

通常,前端选择本地的图片后,发送到后端。后端将图片保存到本地指定目录中,同时在数据库中存入该图片的路径。当前端需要显示时也仅仅返回拼接后的路径,这里的路径随着nginx的配置不同而不同。

2.配置nginx

通过nginx的代理,可以实现访问本地资源的需求。同时利用nginx带来的好处是,如果开发环境为windows,而部署环境为linux,只需要做不同的配置即可,代码不变。nginx.conf中的部分配置如下:

server {
        listen       8086;
        server_name  localhost;
        
        location /localImage {
            alias D:/testImage/;
            allow all;
            autoindex on;
        }

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

这个配置监听本地的8086端口,alias指定了一个虚拟目录,当浏览器中访问/localImage时,就会去D:/testImage/下找资源。比如我在D:/testImage/下放了几张图片,在浏览器中输入http://localhost:8086/localImage/
在这里插入图片描述

点击对应图片就会进行展示,这不正是前端所需要的么,写个demo试试。

3.前端逻辑

前端使用vue,采用elementui

<template>
  <div style="height: 400px; width: 400px; background-color: gray">
    <el-upload
        class="avatar-uploader"
        :show-file-list="false"
        :http-request="upload"
        action="#">
      <img v-if="imageUrl" :src="imageUrl" class="avatar">
      <i v-else class="el-icon-plus avatar-uploader-icon"></i>
    </el-upload>
  </div>
</template>

对应的上传方法为:

<script>
import axios from "axios";

export default {
  data() {
    return {
      imageUrl: ''
    };
  },
  methods: {
    upload(param){
      console.log(param.file)
      let formData=new FormData()
      formData.append("file",param.file);
      axios({
        headers: {
          'Content-Type': 'multipart/form-data',
        },
        method: 'post',
        data: formData,
        url: 'http://localhost:8081/upload',
      }).then(res => {
        this.imageUrl = res.data; //图片回显
        console.log(res.data)
      });
    },
  }
}
</script>

这里,在选择文件后,组件会将将本地图片转换为File,放在表单中进行发送。后端处理后返回该图片的url,在img标签中进行显示,实现回显功能。

4.后端逻辑

@RequestMapping("/upload")
public String upload(@RequestParam(value = "file") MultipartFile file){
    String fileName = file.getOriginalFilename();
    String path="D:/testImage/" + fileName;
    File dest = new File( path);
    try {
        file.transferTo(dest); // 保存文件到本地

        Image image=new Image(); //存数据库
        image.setPath(path);
        imageMapper.insert(image);

        return "http://localhost:8086/localImage/"+fileName;
    } catch (Exception e) {
        e.printStackTrace();
        return "false";
    }
}

后端返回给前端的是一个在nginx中配置的url+图片名称,这样可以直接进行显示。效果如下:
在这里插入图片描述

在这里插入图片描述

参考

nginx可以通过配置来解决静态资源跨域问题。在nginx的配置文件中,可以使用add_header指令来设置Access-Control-Allow-Origin头部,从而允许跨域访问静态资源。例如,可以在静态资源站点的配置中添加以下代码: ``` server { listen 80; add_header 'Access-Control-Allow-Origin' '*'; server_name dev.aaa.com; root /yuxuntoo/static/uploadfile; index index.html; } ``` 通过这样的配置,就可以解决静态资源站点的跨域问题。这里的`add_header 'Access-Control-Allow-Origin' '*'`表示允许任何来源的请求访问静态资源。当然,你也可以根据需要设置具体的来源。 需要注意的是,这只是一种解决静态资源跨域问题的方法,还有其他的解决方案,比如使用CDN来处理跨域问题。具体的选择可以根据实际情况和需求来决定。\[1\]\[2\] #### 引用[.reference_title] - *1* [Nginx解决静态资源跨域问题](https://blog.csdn.net/ybb_ymm/article/details/128691476)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [04-nginx的跨域、静态资源防盗链、rewrite](https://blog.csdn.net/qq_43788522/article/details/125822128)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值