По сути, есть несколько моментов, которые вам сначала необходимо понять, а затем решить, что вы хотите сделать,
1. Требуется ли создание Excel на диске или вы можете передавать его из памяти?
Если загружается всплывающее окно, пользователь может держать его открытым в течение долгого времени, и память будет занята в течение этого периода (недостаток подхода с использованием памяти).
Во-вторых, если сгенерированный файл должен быть новым для каждого запроса (т. Е. Экспортируемые данные различны), то нет смысла хранить его на диске (недостаток подхода на диске).
В-третьих, для кода API будет сложно выполнить очистку диска, потому что вы никогда не знаете заранее, как, когда пользователь завершит свою загрузку (недостаток в подходе к диску).
Answer by Fizik26 - это In-Memory подход, при котором вы не создаете файл на диске. , Из этого ответа единственное, что вам нужно отслеживать длину массива out.toByteArray()
, и это легко сделать с помощью класса-оболочки.
2. При загрузке файла ваш код должен передавать поток файлов по частям - для этого и нужны потоки Java.
Код, как показано ниже, делает это.
return ResponseEntity.ok().contentLength(inputStreamWrapper.getByteCount())
.contentType(MediaType.parseMediaType("application/vnd.ms-excel"))
.cacheControl(CacheControl.noCache())
.header("Content-Disposition", "attachment; filename=" + "SYSTEM_GENERATED_FILE_NM")
.body(new InputStreamResource(inputStreamWrapper.getByteArrayInputStream()));
и inputStreamWrapper
это как,
public class ByteArrayInputStreamWrapper {
private ByteArrayInputStream byteArrayInputStream;
private int byteCount;
public ByteArrayInputStream getByteArrayInputStream() {
return byteArrayInputStream;
}
public void setByteArrayInputStream(ByteArrayInputStream byteArrayInputStream) {
this.byteArrayInputStream = byteArrayInputStream;
}
public int getByteCount() {
return byteCount;
}
public void setByteCount(int byteCount) {
this.byteCount = byteCount;
}
}
Что касается имени файла, если имя файла не является вводом в конечную точку - это означает, что ..its система сгенерирована (комбинация постоянной строки плюс переменная часть для пользователя). Я не уверен, почему вы должны получить это из ресурса.
Эта оболочка вам не понадобится, если вы ее используете - org.springframework.core.io.ByteArrayResource