web-dev-qa-db-fra.com

comment télécharger et sauvegarder un fichier dans db, utilisez-vous Spring Boot et jpa?

Je suis nouveau dans le démarrage de printemps.Je veux télécharger un petit fichier utiliser démarrage de printemps et le sauvegarder dans db utiliser jpa. Mais je n'ai pas une bonne résolution. Mon programme ressemble à ceci:
base de données:

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

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

Je ne sais pas si je peux poster un fichier et d'autres paramètres sur le serveur en une seule requête, puis enregistrer les données dans la base de données. Pourriez-vous me donner une résolution? Remerciement spécial.

4
Karl Doenitz

Utilisez le fichier multipart de Spring . Dans une implémentation simple, vous pouvez alors obtenir InputStream, lire le contenu du fichier (enregistré sur le disque dur) dans un tableau d'octets et l'enregistrer dans la base de données.

1
dev-null

Envisagez de voter si cette réponse vous aide. Supposons que vous souhaitiez télécharger les données d'un fichier dans une base de données, vous pouvez le faire en deux étapes:

  1. téléchargez votre fichier en tant que fichier multipart dans votre classe de contrôleur.

@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. Lisez votre fichier téléchargé "inputStream", récupérez les données et insérez-les dans votre base de données via dbQuary.

0
Vikash Kumar