【问题标题】:how to upload file and save file in db use spring boot and jpa?如何使用spring boot和jpa在db中上传文件和保存文件?
【发布时间】:2017-01-17 21:17:49
【问题描述】:

我是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 豆:
报告.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:

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

ReportService.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:

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:

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:

@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");
    }
}

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

【问题讨论】:

  • 也许您应该将文件保存在本地文件系统上。
  • 不行,投影需要我们在db中保存文件。
  • “分辨率不好”?那应该是什么意思?你试过了,有异常?

标签: java spring jpa


【解决方案1】:

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

【讨论】:

  • 我们可以简单地使用MultipartFile#getBytes()吗?
【解决方案2】:

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

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

  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”获取数据并通过您的数据库查询将其插入您的数据库

【讨论】:

  • 您可能还想添加 HTML &lt;form&gt; 标签需要有一个 enctype="multipart/form-data" 属性
【解决方案3】:

我制作了一个应用程序,可以使用 Spring Boot Rest API 向数据库上传、下载和删除文件。我还使用 Spring Web MultipartFile 接口来处理 HTTP 多部分请求。

源码:https://github.com/OusamaELIDRISSI/upload-files-database

编码愉快?

【讨论】:

    猜你喜欢
    • 2019-06-21
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2017-08-19
    • 2015-10-28
    • 2021-02-18
    相关资源
    最近更新 更多