Файл ppt поврежден после восстановления его из среднего блока MySQL - PullRequest
0 голосов
/ 27 мая 2020

Я переписываю устаревшее приложение 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 дней и тестировал самые распространенные подходы.

1 Ответ

0 голосов
/ 28 мая 2020

Хорошо, я узнал, что случилось. Проблема была в кодировке таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...