Java 如何使用spring boot和jpa在db中上传文件和保存文件?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/39416365/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 21:07:14  来源:igfitidea点击:

how to upload file and save file in db use spring boot and jpa?

javaspringjpa

提问by Karl Doenitz

I am new in spring boot.I wanna upload a small file use spring boot and save it in db use jpa. But I don't have good resolution. My program like these:
database table:

我是spring boot的新手。我想使用spring boot上传一个小文件并将其保存在db中使用jpa。但我没有很好的分辨率。我的程序是这样的:
数据库表:

CREATE TABLE `report` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `logo` BLOB NOT NULL,
  `created_time` int(10) NOT NULL,
  `updated_time` int(10) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8

jpa bean:
Report.java

jpa bean:
Report.java

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.Table;
import java.io.Serializable;

@Entity
@Table(name="mf_report")
public class Report implements Serializable{
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    @Lob
    @Column(name="logo", length=100000)
    private byte[] logo;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public byte[] getLogo() {
        return logo;
    }

    public void setLogo(byte[] logo) {
        this.logo = logo;
    }
}

ReportReposity.java:

ReportReposity.java:

@Repository
public interface ReportRepository extends CrudRepository<Report,Long>{
}

ReportService.java:

报表服务.java:

@Service
public class ReportService extends CrudService<Report, ReportRepository> {

    private final static Logger logger = LoggerFactory.getLogger(ReportService.class);

    @Override
    @Autowired
    public void setRepo(ReportRepository repo) {
        this.repo = repo;
    }

    @Override
    public Report copy(Report from, Report to) {
        to = from;
        return to;
    }

    @Autowired
    private ReportRepository reportRepository;

    public boolean saveReportByRequestBean(ReportAddQueryRequest reportBeanQueryRequest){
    try {
        Report report = new Report();
        report.setName(reportBeanQueryRequest.getName());
        report.setLogo(reportBeanQueryRequest.getLogo());
        long now = System.currentTimeMillis()/1000;
        report.setCreateTime(now);
        report.setUpdateTime(now);
        this.save(report);
    }catch (Exception e){
        logger.error("save report error:", e);
        return false;
    }
    return true;
}
}

ReportParamBean.java:

ReportParamBean.java:

import org.hibernate.validator.constraints.NotEmpty;
import java.io.Serializable;

public class ReportParamBean extends AbsRequest implements Serializable {
    private long reportId;
    @NotEmpty(message = "Param 'name' can't be NULL")
    private String name;
    private String logo;// In fact, I don't know what type should logo be, File or ?
}

AbsRequest.java:

AbsRequest.java:

public class AbsRequest implements Serializable {
    private static final long serialVersionUID = -8928786145900600868L;
    @NotEmpty(message = "Param 'token' can't be NULL")
    @NotNull
    private String token;
    @NotEmpty(message = "Param 'sign' can't be NULL")
    private String sign;
    @Min(value = 1, message = "Param 'time' is invalid")
    private Long time;
    @Min(value = -1, message = "Param 'nodeId' is invalid")
    @NotNull(message = "Param 'nodeId' can't be NULL")
    private Long nodeId;
    private String nodeName;
    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("token", token)
                .append("sign", sign)
                .append("time", time)
                .append("nodeId", nodeId)
                .append("nodeName", nodeName)
                .toString();
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public Long getTime() {
        return time;
    }

    public void setTime(Long time) {
        this.time = time;
    }

    public Long getNodeId() {
        return nodeId;
    }

    public void setNodeId(Long nodeId) {
        this.nodeId = nodeId;
    }

    public String getNodeName() {
        return nodeName;
    }

    public void setNodeName(String nodeName) {
        this.nodeName = nodeName;
    }
}

ReportController.java:

报表控制器.java:

@RestController
@RequestMapping("/api")
public class ReportController {

    @Autowired
    private ReportService reportService;

    @RequestMapping(value = "/report", method = RequestMethod.POST, produces = MediaTypes.JSON_UTF_8)
    public JSONObject createReport(@RequestBody ReportAddQueryRequest reportBeanQueryRequest){
        boolean result = reportService.saveReportByRequestBean(reportBeanQueryRequest);
        if (!result){
            return ResponseWrapper.buildResponse(RTCodeEnum.C_SERVICE_NOT_AVAILABLE, "add report failed");
        }
        return ResponseWrapper.buildResponse(RTCodeEnum.C_OK, "add report success");
    }
}

I don't know whether I can post a file and other params to server in just one post request,then save the data in db.Could you give me resolution. Special thanks.

我不知道我是否可以在一个 post 请求中将文件和其他参数发布到服务器,然后将数据保存在 db 中。你能给我解决方案吗?特别感谢。

回答by ps-aux

Use Spring's multipart file. In simple implementation you can then get InputStreamfrom it, read the content of the file (being saved on hdd) to a byte array and save it to database.

使用 Spring 的multipart file。在简单的实现中,您可以从中获取InputStream,将文件的内容(保存在硬盘上)读取到字节数组并将其保存到数据库中。

回答by Vikash Kumar

Consider up voting if this answer help you.

如果此答案对您有帮助,请考虑投票。

suppose you want to upload a file's data to database then you could do it in two steps:

假设您想将文件的数据上传到数据库,那么您可以分两步完成:

  1. upload your file as multipart file in your controller class.

    @PostMapping("/uploadYourFile")
    
    public String uploadFile( MultipartFile file) throws IOException {
        FileInputStream inputStream = (FileInputStream) file.getInputStream();
    
        //you can use inputStream object which currently has your "file" data
        // you can process this to fetch your data.
        return  "file uploaded successfully ";
    }
    
  2. Read your uploaded file"inputStream" fetch the data and insert it into your DB through your db query

  1. 在控制器类中将文件上传为多部分文件。

    @PostMapping("/uploadYourFile")
    
    public String uploadFile( MultipartFile file) throws IOException {
        FileInputStream inputStream = (FileInputStream) file.getInputStream();
    
        //you can use inputStream object which currently has your "file" data
        // you can process this to fetch your data.
        return  "file uploaded successfully ";
    }
    
  2. 读取您上传的文件“inputStream”获取数据并通过您的数据库查询将其插入到您的数据库中