数据库存储图片路径并显示到前端

数据库存储图片路径并显示到前端

-为啥不直接存图片:因为图片本身太大了,虽然存取方便了程序员,但对数据库不友好。所以采取存取路径,再根据路径解析的方法。

一、数据库表设计:

从以上思想出发,需要存图片的表的该列就应该是字符串类型(varchar),存的是图片路径(我这里存的是文件名),用字符串拼接方法找到全路径。

二、Controller怎么处理

这里是存进去(insert)的过程,取出来就是一般操作,获取数据库中的路径,就以String传到前端。

    @RequestMapping("/insertDiary.do")
    public String insertDiary(MultipartFile file, Diary diary, @ModelAttribute("username") String username) throws IOException {
        //图片上传成功后,将图片的地址写到数据库
        String filePath = "C:\\Images";
        //获取原始图片的拓展名
        String originalFilename = file.getOriginalFilename();
        //新的文件名字
        String newFileName = new Date().getTime() + originalFilename;
        //封装上传文件位置的全路径
        File targetFile = new File(filePath,newFileName);
        //把本地文件上传到封装上传文件位置的全路径
        file.transferTo(targetFile);

        diary.setStu_username(username);
        Date date=new Date();
        java.sql.Date sqlDate=new java.sql.Date(date.getTime());
        diary.setDiary_time(sqlDate);
        diary.setAttachment(newFileName);
        diaryService.insertDiary(diary);
        return "success";
    }

重点是以下这段:

        String filePath = "C:\\Images";
        //获取原始图片的拓展名
        String originalFilename = file.getOriginalFilename();
        //新的文件名字
        String newFileName = new Date().getTime() + originalFilename;
        //封装上传文件位置的全路径
        File targetFile = new File(filePath,newFileName);
        //把本地文件上传到封装上传文件位置的全路径
        file.transferTo(targetFile);

1、C:\\Images 是我自己创建的用于存储图片的本地文件夹路径。
2、重命名文件名:用字符串拼接方法,保留原名(包括拓展名),然后在其前面加上时间戳,形成独一无二的一长串新文件名。
3、封装全路径:将我创建的文件夹名和新文件名一起作为参数传进File,此时得到的targetFile是一个名为新文件名的file对象。
4、将本地文件上传到封装上传文件位置的全路径(移植过去)
在这里插入图片描述

三、配置

3.1 pom引入文件上传的两个包

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.5</version>
    </dependency>
  </dependencies>

3.2 springmvc.xml配置文件上传解析器

没有这个是无法用multipart的

    <!-- 文件上传的解析器 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 上传图片的最大尺寸 10M-->
        <property name="maxUploadSize" value="10485760"></property>
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8"></property>
    </bean>

四、前端提交表单

4.1 存的jsp

form里一定要加上:
enctype="multipart/form-data"
才可以上传媒体文件!

<form action="${pageContext.request.contextPath}/xxx.do" method="post" enctype="multipart/form-data">

4.2 取的jsp

我是通过jsp中url传参方式将数据传到另一个负责显示的jsp的,所以这里是在jsp先获取数据,再用<%=%>显示数据。(att就是传来的文件名变量)

img标签下src的路径很关键!!!
【如果直接写文件的绝对路径(C:\Images<%=att%>)是无法访问到的】

原因:因为图片是存到了本地文件夹,并没有在项目路径下,所以运行时直接访问图片路径会404.

解决思路:需要在tomcat下有这个文件呀,至少让它知道文件路径在哪->配置虚拟路径

解决方法idea的朋友们看这里:

step1:需要在tomcat配置虚拟路径,映射到本地路径,才能访问到。
找到tomcat下的server.xml文件
在这里插入图片描述
在标签内加上这么一句话:

<Context crossContext="true" debug="0" docBase="C:\Images" path="/imgUrl" reloadable="true"/> 

在这里插入图片描述

docBase是实际的本地路径
path是供读取的路径
即:当读取到/imgUrl时,就会自动将/imgUrl解析成C:\Images,这样就可以根据数据库中的相对路径来拼接出绝对路径读取到图片。

所以jsp这里src可以直接用/imgUrl

附件:<img src="/imgUrl/<%=att%>"/><br/>

然后切记:重启tomcat


step2:idea需要配置tomcat中的:勾选以下就行。
在这里插入图片描述


嗯。然后就可以显示图片了!!!哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈快乐!!!!!!!!!!!!!!!!!!!

嘿嘿 下一个想搞一下 上传文件 然后查看的时候可以下载下来的功能。本期就到这里!


参考文献:
ssm框架实现图片上传显示并保存地址到数据库

IDEA设置虚拟路径,解决前端展示本地磁盘图片问题!

  • 17
    点赞
  • 200
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
首先,在数据库存储图片路径需要在后端进行操作。可以将图片存储在服务器上的某个文件夹中,并在数据库存储图片路径,例如存储路径为`/images`的文件夹中,则可以将图片路径存储为`/images/xxx.jpg`。 接下来,后端可以通过接口将存储数据库中的图片路径返回给前端。在Spring Boot中,可以使用`@RestController`注解定义一个RESTful接口,使用`@GetMapping`注解定义一个GET请求的接口,然后使用`ResponseEntity`将图片返回给前端,例如: ```java @RestController public class ImageController { @GetMapping("/image/{id}") public ResponseEntity<byte[]> getImage(@PathVariable("id") Long id) throws IOException { // 根据id从数据库中获取图片路径 String imagePath = getImagePathById(id); // 读取图片文件 File file = new File(imagePath); FileInputStream input = new FileInputStream(file); byte[] bytes = new byte[input.available()]; input.read(bytes); input.close(); // 设置HTTP响应头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_JPEG); // 返回图片数据 return new ResponseEntity<>(bytes, headers, HttpStatus.OK); } // 根据id从数据库中获取图片路径的实现代码 private String getImagePathById(Long id) { // ... } } ``` 在Vue前端中,可以使用`<img>`标签来显示图片。在`src`属性中设置图片的URL,即可从后端获取图片显示,例如: ```html <template> <div> <img :src="imageSrc" alt="image"> </div> </template> <script> export default { data() { return { imageSrc: '' } }, mounted() { this.loadImage() }, methods: { loadImage() { // 发送GET请求获取图片数据 axios.get('/image/1', { responseType: 'arraybuffer' }).then(response => { // 将图片数据转换为Base64编码的字符串 let base64Str = btoa( new Uint8Array(response.data) .reduce((data, byte) => data + String.fromCharCode(byte), '') ) // 设置图片的URL this.imageSrc = 'data:image/jpeg;base64,' + base64Str }) } } } </script> ``` 这样,前端就可以从后端获取存储数据库中的图片显示了。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不试一下怎么知道我不行?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值