Я переписываю устаревшее приложение PHP на Java Spring Boot. Есть механизм для хранения и извлечения файлов ppt в MySQL db. Php db insert:
$fsize = filesize($tmpFile);
$blob = addslashes(fread(fopen($tmpFile, "r"), $fsize));
$sql = "INSERT INTO tablename (id, pptSnapshot) VALUES ($id, '$blob')";
Php db retrieve:
$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 -> все работает как шарм.
Большое спасибо за любую идею, как решить эту проблему. PS Ищу около 2 дней и тестировал самые распространенные подходы.