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
how to upload file and save file in db use spring boot and jpa?
提问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 InputStream
from 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:
假设您想将文件的数据上传到数据库,那么您可以分两步完成:
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 "; }
Read your uploaded file"inputStream" fetch the data and insert it into your DB through your db query
在控制器类中将文件上传为多部分文件。
@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 "; }
读取您上传的文件“inputStream”获取数据并通过您的数据库查询将其插入到您的数据库中