2016-01-08 4 views
0

У меня есть форма, чтобы перечислить ведра в опциях выбора, она загружает файл в корзину после выбора ведра и файла, но я не могу получить выбранный ковш в контроллере, папка alwsy return пустая строка, хотя mutipartFile не проблема, я действительно хочу знать, почему! Я googled для всей этой недели, но никакого результата, что мне нужно! Я очень новый в thymeleaf даже весной рамки :( Pls помочь мне решить эту простую задачу для вас :)Невозможно получить выбранную опцию в контроллере

части HTML-файл, как показано ниже:

<form role="form" enctype="multipart/form-data" action="#" th:object="${folder}" th:action="@{'/drill/skin/upload'}" method="POST"> 
    <div class="form-group"> 
    <label class="form-control-static">Select Bucket</label> 
    <select class="form-control" th:field="${folder}"> 
     <option th:each="bucket : ${buckets}" th:value="${bucket.name}" th:text="${bucket.name}">bucket</option> 
    </select> 
    </div> 

    <label class="form-control-static" for="inputSuccess">Select Upload File</label> 
    <div class="form-group"> 
    <input type="file" class="form-control" name="uploadFile"/> 
    </div> 
    <div class="form-group"> 
    <button class="btn btn-primary center-block" type="submit">Upload</button> 
    </div> 
</form> 

контроллера, как показано ниже:

@RequestMapping(value="/", method=RequestMethod.GET) 
public String provideUploadInfo(Model model) { 
    List<Bucket> buckets = s3Service.listBuckets(); 
    model.addAttribute("buckets", buckets); 
    model.addAttribute("folder", "com.smartstudy"); 
    return "index"; 
} 

@RequestMapping(value="/upload", method=RequestMethod.POST) 
public String handleFileUpload(
    @ModelAttribute("folder") String folder, 
    @RequestParam("uploadFile") MultipartFile uploadFile, Model model) { 
    log.info("Bucket: " + folder + ", uploadFile: " + uploadFile.getOriginalFilename()); 
    if (!uploadFile.isEmpty() && !folder.isEmpty()) { 
    return s3Service.upload(uploadFile, folder); 
    } 
    return "index"; 
} 

ответ

2

В коде есть пара проблем.

В идеале вся форма должна быть инкапсулирована в один объект, поддерживающий форму. В вашем случае создайте объект Java, который обертывает папку и файл вместе.

class BucketFileForm{ 

    private MultipartFile uploadFile; 
    private String folder; 

    public String getFolder() { 
     return folder; 
    } 
    public void setFolder(String folder) { 
     this.folder = folder; 
    } 
    public MultipartFile getUploadFile() { 
     return uploadFile; 
    } 
    public void setUploadFile(MultipartFile uploadFile) { 
     this.uploadFile = uploadFile; 
    } 
} 

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

@RequestMapping(value="/", method=RequestMethod.GET) 
public String provideUploadInfo(Model model) { 
    List<Bucket> buckets = s3Service.listBuckets(); 
    model.addAttribute("buckets", buckets); 

    //replace this 
    //model.addAttribute("folder", "com.smartstudy"); 

    //with 
    BucketFileForm bucketFileForm = new BucketFileForm(); 
    bucketFileForm.setFolder("com.smartstudy"); 
    model.addAttribute("bucketFileForm", bucketFileForm); 

    return "index"; 
} 

Теперь используйте этот объект формы-подложки в виде

<form role="form" enctype="multipart/form-data" action="#" th:object="${bucketFileForm}" th:action="@{'/drill/skin/upload'}" method="POST"> 
    <div class="form-group"> 
     <label class="form-control-static">Select Bucket</label> 
     <select class="form-control" th:field="*{folder}"> 
      <option th:each="bucket : ${buckets}" th:value="${bucket.name}" th:text="${bucket.name}">bucket</option> 
     </select> 
    </div> 

    <label class="form-control-static" for="inputSuccess">Select Upload File</label> 
    <div class="form-group"> 
     <input type="file" th:field="*{uploadFile}" class="form-control" name="uploadFile"/> 
    </div> 
    <div class="form-group"> 
     <button class="btn btn-primary center-block" type="submit">Upload</button> 
    </div> 
</form> 

Затем измените ваша конечная точка POST для размещения этих изменений.

@RequestMapping(value="/upload", method=RequestMethod.POST) 
public String handleFileUpload(@ModelAttribute("bucketFileForm") final BucketFileForm form, final BindingResult bindingResult, Model model) { 

    log.info("Bucket: " + form.getFolder() + ", uploadFile: " + form.getUploadFile().getOriginalFilename()); 

    if (!form.getUploadFile().isEmpty() && !form.getFolder().isEmpty()) { 
     return s3Service.upload(uploadFile, folder); 
    } 

    return "index"; 
} 
+0

Отлично! Вы правы, одна форма с одним классом формы проста, чтобы сделать что-нибудь еще! – mikezang

+0

фантастический ответ – null

Смежные вопросы