2016-09-09 10 views
3

私は春のブートで新しいです。私は小さなファイルを使用して春のブートをアップロードし、db use jpaで保存します。 しかし、私は良い決断がありません。 これらのように私のプログラム:
データベーステーブル:
dbを使用してファイルをアップロードしてファイルを保存する方法spring bootと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豆:
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:

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

私は、ファイルを投稿することができますかどうかわからないし、他のパラメータを1回のリクエストでサーバに送信し、データをdbに保存します。解決策を教えてください。 特別なおかげです。

+0

ファイルをローカルファイルシステムに保存する必要があります。 – user3410960

+0

いいえ、投影すると、ファイルをdbに保存する必要があります。 –

+1

[HTTPマルチパートリクエストとは](http://stackoverflow.com/questions/16958448/what-is-http-multipart-request)を参照してください。 – Kayaman

答えて

1

春のmultipart fileを使用してください。簡単な実装では、InputStreamを取得し、ファイルの内容(hddに保存されている)をバイト配列に読み込んでデータベースに保存することができます。

+0

'MultipartFile#getBytes()'を使うことはできますか? – naXa

関連する問題