Spring-boot MultipartFile issue with ByteArrayResource

你离开我真会死。 提交于 2020-01-05 03:37:23

问题


I'm trying to implement a rest api consuming excel file. I'm using spring-boot and code is available here.

Code works fine when using FileSystemResource for payload. But i'm not able to make the code work with ByteArrayResource in replacement of FileSystemResource:

RestApi.java:

@RestController
public class RestApi {
    private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

    @PostMapping("/api/upload")
    public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile uploadfile) {
        LOGGER.debug("Single file upload!");
        try {
            LOGGER.info("\n\n ****** File name: {}, type {}! ************", uploadfile.getOriginalFilename(), uploadfile.getContentType());
            this.processExcelFile(uploadfile.getInputStream());
        } catch (Exception e) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<>("Successfully uploaded - " + uploadfile.getOriginalFilename(), new HttpHeaders(), HttpStatus.OK);
    }

    private List<String> processExcelFile(InputStream stream) throws Exception {
        List<String> result = new ArrayList<String>();      

         //Create Workbook instance holding reference to .xlsx file
         try(XSSFWorkbook workbook = new XSSFWorkbook(stream);) {
             //Get first/desired sheet from the workbook
             XSSFSheet sheet = workbook.getSheetAt(0);
             //Iterate through each rows one by one
             Iterator<Row> rowIterator = sheet.iterator();
             while (rowIterator.hasNext()) {
                 Row row = rowIterator.next();
                 String cellValue = row.getCell(0).getRichStringCellValue().toString();
                 result.add(cellValue);
                 LOGGER.info("\n\n ****** Cell value: {} ************", cellValue);
             }
            return result;
         }
    }
}

RestApiTest:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class RestApiTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private ResourceLoader loader;

    @Test
    public void testUploadFile() throws Exception {

        Resource resource = this.loader.getResource("classpath:test.xlsx");

        MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();           
//      parts.add("file", new FileSystemResource(resource.getFile()));
        parts.add("file", new ByteArrayResource(IOUtils.toByteArray(resource.getInputStream())));

        String response = this.restTemplate.postForObject("/api/upload", parts, String.class);

        Assertions.assertThat(response).containsIgnoringCase("success");
    }
}

I'm getting following error when running test:

java.lang.AssertionError: 
Expecting:
 <"{"timestamp":1487852597527,"status":400,"error":"Bad Request","exception":"org.springframework.web.multipart.support.MissingServletRequestPartException","message":"Required request part 'file' is not present","path":"/api/upload"}">
to contain:
 <"success">
 (ignoring case)

Any idea?


回答1:


when using loader.getResource(...) you must use resource itself as answered above. So you don't need ByteArrayResource. I got this problem, but I'm not using resource from classpath. So if someone really need to use ByteArrayResource, here is my workaround

public class FileNameAwareByteArrayResource extends ByteArrayResource {

        private String fileName;

        public FileNameAwareByteArrayResource(String fileName, byte[] byteArray, String description) {
            super(byteArray, description);
            this.fileName = fileName;
        }

        @Override
        public String getFilename() {
            return fileName;
        }
}

and then use it

parts.add("file", new FileNameAwareByteArrayResource("filename", byteArray));


来源:https://stackoverflow.com/questions/42416015/spring-boot-multipartfile-issue-with-bytearrayresource

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!