Как сделать файл загружаемым с сервера во Front End в проекте Spring Boot, API-интерфейс Created Rest для загрузки файлов, но не работает должным образом? - PullRequest
1 голос
/ 02 апреля 2019

В общем, я создал rest контроллер для загрузки и выгрузки файла из внешнего интерфейса (React) в нашу файловую систему.Загрузка работает отлично, как и ожидалось.Однако загрузка остальных API не работает должным образом.он загружает только 12 КБ или что-то вроде файла.Есть ли что-то [конфиги], которые я пропускаю в своем проекте или что?Пожалуйста помоги!Любые комментарии или предложения будут оценены заранее спасибо

@GetMapping("/get")
    fun getFile(@Valid data: FileDeleteDTO): ResponseEntity<Resource>{

        val header = HttpHeaders()

        val fileGetFromDb =  baseFileUploaderAttachmentService.getByUid(data.qquuid)
        if (!fileGetFromDb.isPresent)
            throw FileNotFoundException()
        val pathFileName = fileGetFromDb.get().filename + '.' + fileGetFromDb.get().extension
        val originalFileName = fileGetFromDb.get().originalName + '.' + fileGetFromDb.get().extension
//        val filePath = UPLOAD_ROOT_FOLDER + fileGetFromDb.get().path + pathFileName
        val filePath = UPLOAD_ROOT_FOLDER + fileGetFromDb.get().path
//        val file = File(filePath)
        header.contentType = (MediaType.valueOf(fileGetFromDb.get().mime_type!!))
        header.contentLength = fileGetFromDb.get().size
        header.set("Content-Disposition", "attachment; filename=$originalFileName")

        return ResponseEntity.ok()
                    .headers(header)
                    .body(loadFileAsResource(pathFileName,Paths.get(filePath)))

    }


    fun loadFileAsResource(fileName: String, fileStorageLocation: Path): Resource {

        try {
            val filePath = fileStorageLocation.resolve(fileName).normalize()
            val resource = UrlResource(filePath.toUri())
            return if (resource.exists()) {
                resource
            } else {
                throw FileNotFoundException("File not found $fileName")
            }
        } catch (ex: MalformedURLException) {
            throw Exception("File not found $fileName", ex)
        }

    }

This is the result from Insomnia which shows the result in which only some part of image is downloaded

1 Ответ

0 голосов
/ 02 апреля 2019

Я понятия не имею, что случилось, но я решил вышеуказанную проблему, добавив некоторые элементы заголовка, как показано ниже:

@RequestMapping(value = ["/download"], method = [RequestMethod.GET])
@Throws(IOException::class)
fun downloadFile(@Valid data: FileDeleteDTO): ResponseEntity<Any> {

    val fileGetFromDb =  baseFileUploaderAttachmentService.getByUid(data.qquuid)
    val pathFileName = fileGetFromDb.get().filename + '.' + fileGetFromDb.get().extension
    val originalFileName = fileGetFromDb.get().originalName + '.' + fileGetFromDb.get().extension

    val filePath = UPLOAD_ROOT_FOLDER + fileGetFromDb.get().path + pathFileName

    val file = File(filePath)

    val resource = InputStreamResource(FileInputStream(file))
    val headers = HttpHeaders()

    headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", originalFileName))
    headers.add("Cache-Control", "no-cache, no-store, must-revalidate")
    headers.add("Pragma", "no-cache")
    headers.add("Expires", "0")

    return ResponseEntity.ok().headers(headers).contentLength(
        file.length()
    ).contentType((MediaType.valueOf(fileGetFromDb.get().mime_type!!))).body(resource)
}

Просто интересно, как управление кэшем влияет на эту проблему? Где я могу узнать о заголовках?

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