【问题标题】:How do I insert a photo into the database?如何将照片插入数据库?
【发布时间】:2021-05-29 11:33:15
【问题描述】:

我在数据库中插入 blob 类型照片时遇到问题。我写了代码,我试图用 Postman 测试它,但我发现没有任何反应,也就是说,照片没有插入到数据库中。 我指定我没有收到任何错误。 这是代码:

Product.java

package Model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;

import Model.Product;

@Entity
@Table(name="product")
public class Product {
    @Id
    private String prodcode; 
    private String name; 
    
    @Lob
    private byte[] photo;

    public Product() {
    }

    public Product(String prodcode, String name, byte[] photo) {
        this.prodcode = prodcode;
        this.name = name;
        this.photo = photo;
    }

    public String getProdcode() {
        return prodcode;
    }

    public void setProdcode(String prodcode) {
        this.prodcode = prodcode;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public byte[] getPhoto() {
        return photo;
    }

    public void setPhoto(byte[] photo) {
        this.photo = photo;
    }
}

Product_DAO_Imp

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.example.Model.*;

@Repository
public class Product_DAO_Imp  implements Product_DAO{

    @Autowired
    private SessionFactory sessionFactory;

    
    @Override   
     public boolean updatePhoto(byte[] photo, String prodcode) {  
        boolean status = false;
        Session currentSession= sessionFactory.getCurrentSession();  
          
        try  
        {  
            Query<Product> query = currentSession.createQuery("update Product set photo = :photo where prodcode=:prodcode ");  
            query.setParameter("photo", photo);  
            query.setParameter("prodcode", prodcode);  
            status=true; 
        } catch (Exception e) {
            e.printStackTrace();
        }
        return status;
    }
}

Product_Service_Imp

package com.example.Service;

import java.io.IOException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import com.example.DAO.Product_DAO;
import com.example.Model.Product;

@Service
@Transactional
public class Product_Service_Imp implements Product_Service {
 
    @Autowired
    private Product_DAO productdao;
    
    @Override
     public boolean store(MultipartFile file, String prodcode) throws IOException {
        boolean status = false;
        try {
        Product product=new Product();
        byte[] photo=file.getBytes();
        System.out.println(prodcode);
        System.out.println(photo);
        productdao.updatePhoto(photo, prodcode);
        status=true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return status;
    }  
}

Controller.java

import java.io.IOException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.example.Model.Product;
import com.example.Service.Product_Service;

@RestController
@CrossOrigin(origins="http://localhost:4200")
@RequestMapping(value="/api")
public class Controller {
    
    @Autowired
    private Product_Service productservice;
    
    @PostMapping("/save-photoproduct/{prodcode}")  
    public boolean handleFileUpload(@PathVariable String prodcode,@RequestParam("name") String name,@RequestParam("file") MultipartFile file) throws IOException {  
        return productservice.store(file,prodcode);          
    }  
}

【问题讨论】:

    标签: spring-boot hibernate


    【解决方案1】:

    最好的方法是在将照片存储在文件存储或对象存储中后,仅将照片的 URL 存储在 DB 列中。

    如果我们假设确实需要数据库中的字符串照片作为 BLOB 有一段时间。添加更多细节可能有助于社区成员帮助确定原因。

    1. 该表是否已经有一条与产品代码匹配的记录? 零行匹配将返回成功而不是错误。
    2. 支持测试用例和结果,可以帮助模拟场景或确认确实执行了更新语句

    【讨论】:

    • 是的,我已经创建了表并插入了几条记录。表中已经存在产品代码 PC001,我只想在其中插入产品图像。当我尝试使用 Postman 发送命令时,它返回 true 但图像未插入到数据库中
    • 查看我的回答中的示例
    • 如何获取测试用例?
    【解决方案2】:

    我不建议您将图像存储在 DB(blob 字段)中。因为当你在数据库中存储图像时,数据库的大小会增加。

    最好的方法是仅将图像路径存储在 DB(字符串 image_url)中,并将图像文件存储在您系统中的文件夹或其他位置(如 AWS S3)中。

    请看以下示例:

    1. Uploading Files
    2. Spring Boot file upload example
    3. Spring Boot 2 + Angular 11 + Upload File Example
    4. Angular 11 + SpringBoot Upload/Download MultipartFile

    【讨论】:

    • 因为我是新人,所以我需要一个站点,在其中将其与 Angular 一起展示,即 Springboot 中的后端部分和 Angular 中的前端部分。谢谢
    • 请看例子:3和4
    • 谢谢,但我看到与图像显示有关的部分不存在。在互联网上没有找到,对我来说这是一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多