Получение 404 при попытке загрузить файл без расширения в Spring Boot 2.1 - PullRequest
0 голосов
/ 09 января 2020

, когда я пытаюсь загрузить какой-либо файл без расширения, я получаю [http-bio-8443-exec-8] WARN o.s.w.s.PageNotFound - No mapping found for HTTP request with URI [server/directory/README-325] in DispatcherServlet with name 'download-rest'. Этот файл README-325 является файлом без расширения. Когда мы пытаемся скачать файл с расширением, все в порядке, но, как я уже сказал, проблема в том, что эти файлы без расширения. Когда мы добавляем расширение в этот файл README-325, тогда этот контроллер называется

@RequestMapping(value = "/download")
    @ResponseBody
    public void fileDownload(HttpServletRequest request, HttpServletResponse response, @RequestParam(required = true, value = "server") String server, @RequestParam(required = true, value = "directory") String directory, @RequestParam(required = true, value = "fileName") String fileName) throws IOException {}

Но если файл не имеет расширения, то ни один контроллер не вызывается. Кто-то знает почему? ПРИМЕЧАНИЕ: ни одно решение по схожим вопросам нам не помогло. Версия Spring - 3.2.3. Выпуск и версия Spring Boot - 2.1.

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Глядя на сообщение об ошибке, кажется, что имя файла передается как часть пути запроса:

Не найдено сопоставление для HTTP-запроса с URI [download_path / README-325]

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

/download?server=some-server&directory=some-directory&filename=README-325

Так что вам нужно либо отказаться от того, как вы вызываете свою службу, либо от реализации вашего контроллера. .

Редактировать:

@RequestParam передаются в конце URL, после '?' и разделяется знаком '&'. Но вы отправляете эти значения по пути, в вашем контроллере, вам понадобится @PathVariable для этого.

0 голосов
/ 09 января 2020

Диспетчер Spring (класс, отвечающий за маршрутизацию запросов к вашему контроллеру) ведет себя по-разному, когда последняя часть URL содержит расширение (точка + буквы), а не расширение. Фактически, без расширения Spring действительно уверен, что вы не пытаетесь получить файл.

Вот класс, который я использовал для настройки Spring, чтобы перестать рассылать URL-адреса с расширением как нечто особенное (потому что мои пути может содержать адреса электронной почты). Это не то, что вы ищете - потому что вам нравится способность Spring * automati c извлекать файлы для вас - но это подчеркивает, как Spring пытается разрешить расширение другим способом.

@Configuration
public class SpringWebConfig implements WebMvcConfigurer
{
    //Allows url to end with a suffix (e.g.: /users/user1@gmail.com). Without this configuration,
    //the ".com" suffix would be automatically removed from the path variable.
    @Override
    public void configurePathMatch(PathMatchConfigurer matcher)
    {
        matcher.setUseSuffixPatternMatch(false);
    }

    //Allows url to end with the ".com" suffix with Spring NOT throwing a "http media type" error.
    //See: https://blog.georgovassilis.com/2015/10/29/spring-mvc-rest-controller-says-406-when-emails-are-part-url-path/
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer contentNegotiationConfigurer)
    {
        //Don't look at the url for determining the response media type
        contentNegotiationConfigurer.favorPathExtension(false);

        //If the request header says it wants a response type, try to give it.
        contentNegotiationConfigurer.ignoreAcceptHeader(false);

        //Otherwise, return json.
        contentNegotiationConfigurer.defaultContentType(MediaType.APPLICATION_JSON);
    }
}
...