Как конвертировать base64 в MultipartFile в Java - PullRequest
0 голосов
/ 28 февраля 2019

У меня проблема.Я хочу конвертировать BufferedImage в MultipartFile.Сначала в своем пользовательском интерфейсе я отправил base64 на сервер, а на своем сервере я конвертировал в BufferedImage, после чего я хочу преобразовать BufferedImage в MultipartFile и сохранить в локальном хранилище.Это мой метод:

@PostMapping("/saveCategory")
    @ResponseStatus(HttpStatus.OK)
    public void createCategory(@RequestBody String category ) {



        BufferedImage image = null;
        OutputStream stream;
        byte[] imageByte;
        try {
            BASE64Decoder decoder = new BASE64Decoder();
            imageByte = decoder.decodeBuffer(category);
            ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
            image = ImageIO.read(bis);
            bis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    String fileName = fileStorageService.storeFile(image );

Мой метод хранения:

public String storeFile(MultipartFile file) {
        // Normalize file name
        String fileName = StringUtils.cleanPath(file.getOriginalFilename());
        try {
            // Check if the file's name contains invalid characters
            if (fileName.contains("..")) {
                throw new FileStorageException("Sorry! Filename contains invalid path sequence " + fileName);
            }

            // Copy file to the target location (Replacing existing file with the same name)
            Path targetLocation = this.fileStorageLocation.resolve(fileName);
            Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);

            return fileName;
        } catch (IOException ex) {
            System.out.println(ex);
            throw new FileStorageException("Could not store file " + fileName + ". Please try again!", ex);

        }
    }

1 Ответ

0 голосов
/ 28 февраля 2019

Такое преобразование из base64 в MultipartFile выполняется Spring автоматически.Вам просто нужно использовать правильные аннотации.

Вы можете создать класс оболочки dto, содержащий все необходимые данные.

public class FileUploadDto {
    private String category;
    private MultipartFile file;
    // [...] more fields, getters and setters
}

Затем вы можете использовать этот класс в вашем контроллере:

@RestController
@RequestMapping("/upload")
public class UploadController {

    private static final Logger logger = LoggerFactory.getLogger(UploadController.class);

    @PostMapping
    public void uploadFile(@ModelAttribute FileUploadDto fileUploadDto) {
        logger.info("File upladed, category= {}, fileSize = {} bytes", fileUploadDto.getCategory(), fileUploadDto.getFile().getSize());
    }

}

Причина, по которой я не понял суть вопроса на первый взгляд, была @RequestBody String category.Я думаю, что это очень очень вводящее в заблуждение имя переменной для файла .Однако я создал класс DTO с полем категории также, чтобы вы могли включить его в свой запрос.

Конечно, тогда вы избавляетесь от логики контроллера и просто вызываете метод обслуживания, например fileStorageService.storeFile(fileUploadDto.getFile()); или passвесь файл и используйте поле category.

edit

Я также включаю запрос, отправленный почтальоном, и некоторые результаты консоли:

Postman request and console output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...