Загрузка весеннего файла в смешанной форме

Я наткнулся на то, что, по моему мнению, является ответом на этот вопрос: команда envsubst.

envsubst < something.txt

Если он еще не доступен в вашем дистрибутиве, он находится в

GNU package gettext.

@Rockallite - я написал небольшой скрипт-оболочку, чтобы позаботиться о проблеме «\ $».

(Кстати, есть функция "envsubst, объясненный в https://unix.stackexchange.com/a/294400/7088 для расширения только некоторых переменных на входе, но я согласен, что избежать исключений гораздо удобнее .)

Вот мой скрипт:

#! /bin/bash
      ## -*-Shell-Script-*-
CmdName=${0##*/}
Usage="usage: $CmdName runs envsubst, but allows '\$' to  keep variables from
    being expanded.
  With option   -sl   '\$' keeps the back-slash.
  Default is to replace  '\$' with '$'
"

if [[ $1 = -h ]]  ;then echo -e >&2  "$Usage" ; exit 1 ;fi
if [[ $1 = -sl ]] ;then  sl='\'  ; shift ;fi

sed 's/\\\$/\${EnVsUbDolR}/g' |  EnVsUbDolR=$sl\$  envsubst  "$@"

11
задан skaffman 3 February 2010 в 09:50
поделиться

4 ответа

Обновление: Я думаю, что мой вопрос был плохо сформулирован. То, что я хотел сделать, это создать spring

Я нашел очень хорошее объяснение того, как это сделать в старой документации Spring и применил его к новому Spring 3.0 MVC. В основном это означает, что вам нужно зарегистрировать PropertyEditor в методе @InitBinder вашего контроллера. После этого все будет работать как ожидается (при условии, что вы добавили MultiPartResolver в контекст и установили правильную кодировку формы). Вот мой пример:

@RequestMapping("/scriptfile/**")
@Controller
public class ScriptFileController {

    //we need a special property-editor that knows how to bind the data
    //from the request to a byte[]
    @InitBinder
    public void initBinder(WebDataBinder binder)
    {
        binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
    }

    @RequestMapping(value = "/scriptfile", method = RequestMethod.POST)    
    public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
        if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        
        if (result.hasErrors()) {        
            modelMap.addAttribute("scriptFile", scriptFile);            
            modelMap.addAttribute("showcases", ShowCase.findAllShowCases());            
            return "scriptfile/create";            
        }        
        scriptFile.persist();        
        return "redirect:/scriptfile/" + scriptFile.getId();        
    }    
}
7
ответ дан 3 December 2019 в 08:04
поделиться

Я не верю, что вы можете комбинировать загрузки файлов с обычными формами (по крайней мере, в Spring MVC), потому что формы загрузки файлов используют multipart / form-data вместо обычного application / x-www-form-urlencoded .

Когда вы указываете multipart / form-data , тогда в Spring вам нужно использовать реализацию MultipartResolver (как указано в документах Spring, на которые вы ссылаетесь) и декодирование всех параметров должен пройти через это. Spring MVC не сможет декодировать входные данные нормальной формы, поскольку все поля будут закодированы вместе с загруженным файлом.

Почти наверняка проще использовать две отдельные формы, одну для обычных вещей, а другую для загрузки файлов.

3
ответ дан 3 December 2019 в 08:04
поделиться

Если вы используете Spring 3.0, вы можете создать Converter и Formatter (необязательно). Вам не придется использовать метод initBinder и оставить вещи больше POJO, но ваше решение все еще очень актуально и все еще довольно чистое.

1
ответ дан 3 December 2019 в 08:04
поделиться

См. https://jira.springsource.org/browse/ROO-442 для связанного вопроса Roo.

4
ответ дан 3 December 2019 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: