当前位置: 首页 > 知识库问答 >
问题:

如何在同一POST请求中发送JSON和图像并将其级联?Spring防尘套

易成天
2023-03-14

我有一个名为“Bga”的实体,它有一个图像列表。我试图创建一个Bga,通过JSON发送数据,在同一个请求中,我想上传一个图像,这样我可以级联它,数据库中的表“Image”将具有来自Bga的外键,Bga将具有其图像列表。

我正在做的事情:

发送多部分表单:在此处输入图像描述

其中包含来自实体Bga的JSON数据:在此处输入图像描述

第二条是我上传的图片

我可以创建Bga并单独上传图像,但我不知道如何以级联的方式实现。

POST请求:

@PostMapping
    @ResponseBody
    public ResponseEntity<Bga> createBga(@RequestPart("bga") Bga bga, @RequestPart("file") MultipartFile file) throws IOException {

        fileStorage.save(file);

        bgaRepository.save(bga);

        return ResponseEntity.status(HttpStatus.OK).body(bga);
    }

然后是上传图像的服务:

@Service
public class FileStorageService {
    
    @Autowired
    private ImagemRepository imagemRepository;

public Imagem save(MultipartFile file) throws IOException {
        String fileName = StringUtils.cleanPath(file.getOriginalFilename());
        Imagem Imagem = new Imagem(fileName, file.getContentType(), file.getBytes());

        return imagemRepository.save(Imagem);
    }

}

我将JPA存储库用于这两个方面

实体Bga:

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;


@Entity
@Table(name="BGA")
public class Bga implements Serializable {
    
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id_bga;
    
    
    private String nome;
    
    private int num_bga;
    

    @OneToMany(mappedBy = "bga", cascade = CascadeType.ALL)
    private List<Imagem> imagens;
    
    public Bga() {
        
    }


    

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getNum_bga() {
        return num_bga;
    }

    public void setNum_bga(int num_bga) {
        this.num_bga = num_bga;
    }

    public long getId_bga() {
        return id_bga;
    }

    public void setId_bga(long id_bga) {
        this.id_bga = id_bga;
    }

    public List<Imagem> getImagens() {
        return imagens;
    }

    public void setImagens(List<Imagem> imagens) {
        this.imagens = imagens;
    }

和实体图像:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;


@Entity
public class Imagem {
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id_imagem;

    private String name;

    private String type;

    @Lob
    private byte[] imagem;

    @ManyToOne
    @JoinColumn(name = "id_bga", referencedColumnName = "id_bga")
    private Bga bga;

public Imagem() {

    }
    
    public Long getId_imagem() {
        return id_imagem;
    }

    public void setId_imagem(Long id_imagem) {
        this.id_imagem = id_imagem;
    }

    public byte[] getImagem() {
        return imagem;
    }

    public void setImagem(byte[] imagem) {
        this.imagem = imagem;
    }

    public String getName() {
        return name;
    }

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

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Imagem(String name, String type, byte[] imagem) {
        this.name = name;
        this.type = type;
        this.imagem = imagem;
    }

    public Bga getBga() {
        return bga;
    }

    public void setBga(Bga bga) {
        this.bga = bga;
    }

但我做Bga的方式并没有得到上传的图像:

在此处输入图像描述

如何做到这一点,我可以级联它,所以表图像将有一个外键来自bga?

共有1个答案

龙景澄
2023-03-14

小心事务边界。您希望1个事务存储文件BGA,因此:

  1. 使用事务方法创建一个@Service,该方法接受一个文件和一个bga
  2. 将FileStorageService和BgaRepository自动连接到服务中
  3. 在该方法中运行fileStorage.save(file)bgaRepository.save(bga),然后在Imagem上设置bga

扩展您的文件存储服务以同时获取Bga对象

@Service
public class FileStorageService {

    @Autowired
    private ImagemRepository imagemRepository;
    @Autowired // NEW
    private BgaRepository bgaRepository; // NEW

    @Transactional // NEW
    public Imagem save(Bga bga, MultipartFile file) throws IOException {
        String fileName = StringUtils.cleanPath(file.getOriginalFilename());
        Imagem Imagem = new Imagem(fileName, file.getContentType(), file.getBytes());

        bgaRepository.save(bga); // NEW
        Imagem.setBga(bga); // NEW

        return imagemRepository.save(Imagem);
    }
}

在控制器中,仅使用两个DTO调用1个服务:

@PostMapping
@ResponseBody
public ResponseEntity<Bga> createBga(@RequestPart("bga") Bga bga, @RequestPart("file") MultipartFile file) throws IOException {

    fileStorage.save(bga, file); // NEW: passing in 'bga' here

    // bgaRepository.save(bga); .. DELETED

    return ResponseEntity.status(HttpStatus.OK).body(bga);
}
 类似资料:
  • 我得到以下错误 响应数据为空。我做错了什么,或者我在代码中遗漏了什么?

  • 我试图在ajax调用中发布json请求,但我没有收到来自请求的任何成功响应。 请找到我下面的代码:我在这里做错了什么: 它击中了网址,我得到200确定状态,但它总是出错条件... 有人能帮忙吗,我需要改变什么工作: 我尝试了data:JSON. stringify({key:"value", key1:"value e1"})-但这也没有帮助

  • 有人知道使用发布JSON的正确方法吗? 我从服务器得到响应。它使用Chrome工作。

  • 问题内容: 我想将我的网址发送到(和)。 我当前的请求代码不起作用。 使用是 不是 一个容易回答。 问题答案: 在iOS中发送和请求非常容易。无需其他框架。 请求: 首先,将我们的(按需发送的内容)创建为,然后将其转换为。 目标 接下来,我们阅读的,因此我们可以将其传递给请求。 现在我们有了要发布的内容,我们可以创建一个,并包含我们的。 迅速 最后,我们可以发送请求,并通过创建新的请求来阅读回复:

  • 我是一名服务器端开发人员,学习vanilla JS的诀窍。我需要澄清我的概念,即为我在JS中创建的图像对象发送Ajax POST请求——这个问题与此有关。 想象一下一个网络应用,用户上传照片供他人查看。在上传每个图像时,我使用vanilla JS确认图像的mime类型(通过解释幻数),然后调整图像大小以达到优化目的。 调整大小后,我会: 返回的图像对象必须通过Ajax请求发送到后端。比如: 然而,

  • 问题内容: 我正在尝试发出POST请求,但无法完成。另一端什么也没收到。 这是应该如何工作的吗?我知道该功能,但我想我不能使用它,因为它不能用测试,对吗? 问题答案: 您基本上有正确的想法,只是发送错误的表格。该表格属于请求的正文。