【发布时间】:2020-05-27 15:49:16
【问题描述】:
我正在 Java Spring Boot 上重写旧的 PHP 应用程序。有一种机制可以在 MySQL db 中存储和检索 ppt 文件。 php 数据库插入:
$fsize = filesize($tmpFile);
$blob = addslashes(fread(fopen($tmpFile, "r"), $fsize));
$sql = "INSERT INTO tablename (id, pptSnapshot) VALUES ($id, '$blob')";
php 数据库检索:
$id = $_REQUEST['id'];
$sql = "SELECT pptSnapshot FROM tablename WHERE id=$id";
$result = runQuery($sql, "dm_prj");
$row = mysqli_fetch_array($result);
header("Pragma: no-cache");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment;filename=\"PWS_snapshot_$id.pptx\"");
echo $row['PPTSnapshot'];
在此之后文件就可以了。
但是
我正在尝试使用 Java 获取此文件:
快照实体:
@Entity
@Table(name = "prj_status_report_snapshots")
public class StatusReportSnapshot {
@Id
private int id;
@Lob
private Blob pptSnapshot;
//getters setters
}
服务功能:
public byte[] getUserSnapshot(int id) throws Exception {
StatusReportSnapshot snapshot = this.snapshotRepository.getSnapshotBySnapshotId(id).get();
Blob blob = snapshot.getPptSnapshot();
byte[] blobBytes = blob.getBytes(1, (int) blob.length());
return blobBytes;
}
控制器:
@GetMapping(value = "/test/{id}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public @ResponseBody
byte[] test(@PathVariable int id) throws Exception {
return this.reportService.getUserSnapshot(id);
}
我尝试了不同的方法:将 blob 映射到 String、byte[]、Blob。试图将其保存到文件系统,而不是通过浏览器将其返回给用户。结果总是一样 -> 提取的 PPT 文件大小是预期的两倍或更多,并且已损坏(无法打开它甚至看到空白页)。
我正在使用与 php 应用程序相同的数据库。 对于 php -> 一切都像一个魅力。
非常感谢您对如何解决它的任何想法。 附言我正在搜索大约 2 天并测试了最常见的方法。
【问题讨论】: