springboot上传图片到服务器某个路径,怎么通过这个路径显示图片?路径不在项目路径中

发布于 2022-09-05 15:39:14 字数 385 浏览 18 评论 0

利用springboot开发网站,一个简单的功能:上传图片,然后显示。上传的图片存放在非项目路径下,eg:D:/appdata/images中,然后图片地址放存放在数据库中,存放的数据为D:/appdata/images/picturename.png

想法很简单:从数据库中读取出这个字段,传值到网页,让页面通过这个路径显示图片。但是没有显示,F12调试,图片路径为:http://localhost/D:/appdata/images/picturename.png

有考虑过读取到图片路径,通过流将图片传送到页面,但是查询出来的数据有很多,这样的话每个图片都要转化为流再返回给界面。有没有更好的方案呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

山田美奈子 2022-09-12 15:39:14

將上传图片存放到非项目路劲中,没用文件服务器,也没有使用流传送。实现方案是改变spring的默认静态图片资源路径,当然,这并不是完美的方案:可能也会遇到部署的时候,指定的路径中没有静态图片资源会导致页面无法渲染图片、资源没有打包到项目中。上自己的解决过程。
需要配置springboot。
1、配置application.properties文件,添加配置指定上传路径,比如我的配置字段为:cbs.imagesPath=file:/D:/upload/
2、添加配置类:

import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {

    @Value("${cbs.imagesPath}")
    private String mImagesPath;
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        if(mImagesPath.equals("") || mImagesPath.equals("${cbs.imagesPath}")){
               String imagesPath = WebAppConfig.class.getClassLoader().getResource("").getPath();
               if(imagesPath.indexOf(".jar")>0){
                imagesPath = imagesPath.substring(0, imagesPath.indexOf(".jar"));
               }else if(imagesPath.indexOf("classes")>0){
                imagesPath = "file:"+imagesPath.substring(0, imagesPath.indexOf("classes"));
               }
               imagesPath = imagesPath.substring(0, imagesPath.lastIndexOf("/"))+"/images/";
               mImagesPath = imagesPath;
              }
              LoggerFactory.getLogger(WebAppConfig.class).info("imagesPath="+mImagesPath);
              registry.addResourceHandler("/images/**").addResourceLocations(mImagesPath);
        // TODO Auto-generated method stub
        super.addResourceHandlers(registry);
    }
}

这段代码不需要详细知道什么意思,知道这个代码更改后,图片放到/D:/upload/后,从磁盘读取的图片数据scr将会变成images/picturename.jpg的格式。这样改了之后,网页的静态图片资源就需要放到指定的路径中了,b比如:<link rel="shortcut icon" type="image/x-icon" href="images/avatar_b.jpg" media="screen" />

3、数据库中存放图片再磁盘中的绝对路径:数据库存放样式
4、读取字段,获取文件名,比如/20170824122758.jpg,然后拼装为/images/20170824122758.jpg
5、结果:磁盘中的图片:磁盘中的图片 网页中的图片:网页中的图片
希望大家多多指正,不胜感激!

苏大泽ㄣ 2022-09-12 15:39:14

更好的解决方案?
一般都是将图片上传到一个文件服务器上,可以看看FastDFS或者是OSS,数据库中存储的是文件的绝对地址。

臻嫒无言 2022-09-12 15:39:14

页面读取图片路径最好是相对路径,全路径一般读取不到,当然不排除别的做法。你可以将全路径截取成相对路径放入数据库中,上传文件功能最好是能上传服务器下的文件夹里。

撩动你心 2022-09-12 15:39:14

如果你没有一个单独的服务器处理静态资源请求或者文件服务器的话,你上传的图片还是就写在项目的路径下吧。
这个路径有点搞事情http://localhost/D:/appdata/i...

打小就很酷 2022-09-12 15:39:14

如果是使用的是外置 tomcat 容器,可以在 server.xml 配置一个虚拟目录。

<Context docBase="服务器路径" path="映射路径" />
吃颗糖壮壮胆 2022-09-12 15:39:14

1、使用 止于秋分 说的方式
2、如果有使用 Nginx 的话可以用 Nginx 做个代理,图片等都访问你上传的目录

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文