2015-08-22 8 views
5

Sto tentando di implementare il caricamento dei file utilizzando Spring e Rest. Ecco che cosa ho fatto fino a questo puntoCome convalidare il tipo di file, le dimensioni durante il caricamento in Rest in primavera?

@RestController 
@RequestMapping("/rest/upload") 
public class ProfileImageUploadController { 

    @Autowired 
    ImageValidator imageValidator; 

    @RequestMapping(value="/{userId}/image", method=RequestMethod.POST) 
    public @ResponseBody String handleFileUpload(
     @PathVariable("userId") Integer userId, 
     @ModelAttribute("image") SingleImageFile image, 
     BindingResult result){ 

     MultipartFile file = image.getFile(); 
     imageValidator.validate(file, result); 
     if(!result.hasErrors()){ 
      String name = file.getOriginalFilename(); 
      try{ 
       file.transferTo(new File("/home/maclein/Desktop/"+name)); 
       return "You have successfully uploaded " + name + "!"; 
      }catch(Exception e){ 
       return "You have failed to upload " + name + " => " + e.getMessage(); 
      } 
     } else { 
      return result.getFieldErrors().toString(); 
     } 
    } 
} 

Ecco il mio ImageValidator

@Component 
public class ImageValidator implements Validator { 
    @Override 
    public boolean supports(Class<?> arg0) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void validate(Object uploadedFile, Errors error) { 
     MultipartFile file = (MultipartFile) uploadedFile; 

     if(file.isEmpty() || file.getSize()==0) 
      error.rejectValue("file", "Please select a file"); 
     if(!(file.getContentType().toLowerCase().equals("image/jpg") 
      || file.getContentType().toLowerCase().equals("image/jpeg") 
      || file.getContentType().toLowerCase().equals("image/png"))){ 
      error.rejectValue("file", "jpg/png file types are only supported"); 
     } 
    } 
} 

Ma durante il test tramite postino sua mostra l'errore se il file è in formato PDF, ma in un modo strano. Ecco la rappresentazione di stringa dell'errore

"[campo di errore nell'oggetto 'immagine' su 'file' campo: valore respinto [[email protected]fc04a65]; codici [jpg I tipi di file/png sono supportati.image.file, i tipi di file jpg/png sono supportati solo. I tipi di file jpg/png sono supportati solo.org.springframework.web.multipart.MultipartFile, i tipi di file jpg/png sono supportati ]; argomenti []; messaggio predefinito [null]] "

Non riesco a capire perché la lunghezza dell'elenco di errori è 4. Il mio motivo è quello di mostrare l'errore in JSON se non è convalidato.

Se esiste un modo standard per eseguire questo tipo di convalida? Sono nuovo per la primavera e il riposo. Quindi qualcuno per favore mostrami come raggiungere l'obiettivo.

risposta

1
protected List<String> extractErrorMessages(BindingResult result) { 
     List<String> errorMessages = new ArrayList<>(); 
     for (Object object : result.getAllErrors()) { 
      if (object instanceof FieldError) { 
       FieldError fieldError = (FieldError) object; 
       errorMessages.add(fieldError.getCode()); 
      } 
     } 
     return errorMessages; 
    } 

Date un'occhiata a metodi fieldError, probabilmente nel tuo caso si dovrebbe usare getField

+0

Questa è una roba molto di base. Perché devo importare qualche altra libreria per farlo. Non voglio analizzare il contenuto, ma voglio solo controllare il tipo di contenuto. –

+0

Grazie, ha salvato la giornata. Per quanto riguarda l'implementazione dell'interfaccia Validator, eseguo il controllo manuale. C'è un altro modo in cui, mentre definisco il modello "SingleImageFile", posso definire le mie regole di validazione laggiù? in modo che possa essere automaticamente convalidato. –

+0

Solo ValidationUtils e regole manuali :) –

Problemi correlati