2017-02-11 17 views
0

Мы внедряем веб-приложение, и есть проблема с ссылкой на файл загрузки. Код контроллера:Как сообщить клиентам, что имя файла dows имеет при загрузке с помощью Spring Boot?

@RequestMapping(value = "/file" , method = RequestMethod.GET, 
produces = "application/jar") 
public ResponseEntity<FileSystemResource> getFile() { 
    FileSystemResource resource = new FileSystemResource(new File(PATH_TO_FILE)); 
    HttpHeaders responseHeaders = new HttpHeaders(); 
    responseHeaders.add("Content-Disposition", "attachment; filename=" + FILE_NAME); 
    responseHeaders.add("Content-Type", "application/jar"); 
    ResponseEntity<FileSystemResource> responseEntity = new ResponseEntity<>(resource, responseHeaders, HttpStatus.OK); 
    return responseEntity; 
} 

Проблема заключается в том, что он загружает хорошо из браузера, но не, например, от Wget.

, когда я пытаюсь сделать

wget localhost:8080/file 

я загрузить его, но не как file.jar (который FILE_NAME), а просто файл без расширения.

Есть ли какие-либо решения?

UPD: Я также попытался сменить запрос на file.jar. Но по какой-то причине этот запрос не стрелял. Кроме того, я попытался сделать регулярное выражение (я не помню хорошо, что-то вроде этого)

{filename:[a-zA-Z0-9]+}{extension:\\.[a-z]+} 

Но это только Cought запросы как aaa.bbb, fsdf.sdkfjsdkf (я имею в виду некоторые случайные), но не file.jar , Похоже, в Spring Boot есть специальные обработчики запросов?

Тем не менее, как решить такую ​​проблему?

Спасибо

ответ

0

Мое предложение изменить ваше решение должно быть так:

@RequestMapping(value = "/download/{fileName}" , method = RequestMethod.GET, 
produces = "application/jar") 
public ResponseEntity<FileSystemResource> getFile(@PathVariable("fileName") String fileName) { 
    File pathToFile = findPathToFile(fileName); 
    FileSystemResource resource = new FileSystemResource(new File(pathToFile)); 

    HttpHeaders responseHeaders = new HttpHeaders(); 
    responseHeaders.add("Content-Disposition", "attachment; filename=" + fileName); 
    responseHeaders.add("Content-Type", "application/jar"); 
    ResponseEntity<FileSystemResource> responseEntity = new ResponseEntity<>(resource, responseHeaders, HttpStatus.OK); 
    return responseEntity; 
} 

Тогда вы можете позвонить с помощью Wget:

wget localhost:8080/download/file.jar 

Другой вариант, если вы хотите пойти на компромисс с вашей командой wget, вы можете использовать флаг -O:

wget -O file.jar localhost:8080/file 
+0

Не работает :( Я тоже попробовал. Проблема в том, что по какой-то причине «/download/file.jar» не обрабатывается запрошенным отображаемым значением «/ download/{fileName}» – utkillr

+0

Самое забавное, что запрос на «file.jara» пойман, но а не «file.jar». Похоже, есть вид специального сопоставления запросов. – utkillr

+0

Можете ли вы попробовать использовать это выражение value = "/download/{fileName:.+}" – algojava