Spring MVC File Upload Help

后端 未结 3 1513
名媛妹妹
名媛妹妹 2020-12-15 05:18

I have been integrating spring into an application, and have to redo a file upload from forms. I am aware of what Spring MVC has to offer and what I need to do to configure

相关标签:
3条回答
  • 2020-12-15 05:48

    This is what i prefer while making uploads.I think letting spring to handle file saving, is the best way. Spring does it with its MultipartFile.transferTo(File dest) function.

    import java.io.File;
    import java.io.IOException;
    
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.multipart.MultipartFile;
    
    @Controller
    @RequestMapping("/upload")
    public class UploadController {
    
        @ResponseBody
        @RequestMapping(value = "/save")
        public String handleUpload(
                @RequestParam(value = "file", required = false) MultipartFile multipartFile,
                HttpServletResponse httpServletResponse) {
    
            String orgName = multipartFile.getOriginalFilename();
    
            String filePath = "/my_uploads/" + orgName;
            File dest = new File(filePath);
            try {
                multipartFile.transferTo(dest);
            } catch (IllegalStateException e) {
                e.printStackTrace();
                return "File uploaded failed:" + orgName;
            } catch (IOException e) {
                e.printStackTrace();
                return "File uploaded failed:" + orgName;
            }
            return "File uploaded:" + orgName;
        }
    }
    
    0 讨论(0)
  • 2020-12-15 05:50

    Use the below controller class for processing the file upload.

    @Controller
    public class FileUploadController {
    
      @Autowired
      private FileUploadService uploadService;
    
      @RequestMapping(value = "/fileUploader", method = RequestMethod.GET)
      public String home() {
        return "fileUploader";
      }
    
      @RequestMapping(value = "/upload", method = RequestMethod.POST)
      public @ResponseBody List<UploadedFile> upload(MultipartHttpServletRequest request, HttpServletResponse response) throws IOException {
    
        // Getting uploaded files from the request object
        Map<String, MultipartFile> fileMap = request.getFileMap();
    
        // Maintain a list to send back the files info. to the client side
        List<UploadedFile> uploadedFiles = new ArrayList<UploadedFile>();
    
        // Iterate through the map
        for (MultipartFile multipartFile : fileMap.values()) {
    
          // Save the file to local disk
          saveFileToLocalDisk(multipartFile);
    
          UploadedFile fileInfo = getUploadedFileInfo(multipartFile);
    
          // Save the file info to database
          fileInfo = saveFileToDatabase(fileInfo);
    
          // adding the file info to the list
          uploadedFiles.add(fileInfo);
        }
    
        return uploadedFiles;
      }
    
      @RequestMapping(value = {"/listFiles"})
      public String listBooks(Map<String, Object> map) {
    
        map.put("fileList", uploadService.listFiles());
    
        return "listFiles";
      }
    
      @RequestMapping(value = "/getdata/{fileId}", method = RequestMethod.GET)
      public void getFile(HttpServletResponse response, @PathVariable Long fileId) {
    
        UploadedFile dataFile = uploadService.getFile(fileId);
    
        File file = new File(dataFile.getLocation(), dataFile.getName());
    
        try {
          response.setContentType(dataFile.getType());
          response.setHeader("Content-disposition", "attachment; filename=\"" + dataFile.getName() + "\"");
    
          FileCopyUtils.copy(FileUtils.readFileToByteArray(file), response.getOutputStream());
    
    
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    
    
      private void saveFileToLocalDisk(MultipartFile multipartFile) throws IOException, FileNotFoundException {
    
        String outputFileName = getOutputFilename(multipartFile);
    
        FileCopyUtils.copy(multipartFile.getBytes(), new FileOutputStream(outputFileName));
      }
    
      private UploadedFile saveFileToDatabase(UploadedFile uploadedFile) {
        return uploadService.saveFile(uploadedFile);
      }
    
      private String getOutputFilename(MultipartFile multipartFile) {
        return getDestinationLocation() + multipartFile.getOriginalFilename();
      }
    
      private UploadedFile getUploadedFileInfo(MultipartFile multipartFile) throws IOException {
    
        UploadedFile fileInfo = new UploadedFile();
        fileInfo.setName(multipartFile.getOriginalFilename());
        fileInfo.setSize(multipartFile.getSize());
        fileInfo.setType(multipartFile.getContentType());
        fileInfo.setLocation(getDestinationLocation());
    
        return fileInfo;
      }
    
      private String getDestinationLocation() {
        return "Drive:/uploaded-files/";
      }
    }
    
    0 讨论(0)
  • 2020-12-15 05:53

    but what none of these tutorials explain is correct/best practice methods on how/what is to be done to actually handle the file once you have it

    The best practice depends on what you are trying to do. Usually i use some AOP to post-proccessing the uploaded file. Then you can use FileCopyUtils to store your uploaded file

    @Autowired
    @Qualifier("commandRepository")
    private AbstractRepository<Command, Integer> commandRepository;
    
    protected ModelAndView onSubmit(...) throws ServletException, IOException {
        commandRepository.add(command);
    }
    

    AOP is described as follows

    @Aspect
    public class UploadedFileAspect {
    
        @After("execution(* br.com.ar.CommandRepository*.add(..))")
        public void storeUploadedFile(JoinPoint joinPoint) {
            Command command = (Command) joinPoint.getArgs()[0];
    
            byte[] fileAsByte = command.getFile();
            if (fileAsByte != null) {
                try {
                    FileCopyUtils.copy(fileAsByte, new File("<SET_UP_TARGET_FILE_RIGHT_HERE>"));
                } catch (IOException e) {
                    /**
                      * log errors
                      */
                }
            }
    
        }
    

    Do not forget enable aspect (update schema to Spring 3.0 if needed) Put on the classpath aspectjrt.jar and aspectjweaver.jar (<SPRING_HOME>/lib/aspectj) and

    <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:aop="http://www.springframework.org/schema/aop"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
                              http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                              http://www.springframework.org/schema/aop
                              http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
        <aop:aspectj-autoproxy />
        <bean class="br.com.ar.aop.UploadedFileAspect"/>
    
    0 讨论(0)
提交回复
热议问题