Aws s3 не принимает MultipartFile и не работает нормально Загрузка файла на сервер tomcat после развертывания и локальная работа - PullRequest
1 голос
/ 21 февраля 2020

При загрузке файла в aws s3 bucket, он отлично работает локально. Но когда я развернул проект на сервере Tomcat, он дал ошибку, чтобы написать fileoutputstream (разрешение отклонено)

Вот изображение

enter image description here

Вот мой код

private File convertMultiPartToFile(MultipartFile file) throws IOException {
        File convFile = new File(file.getOriginalFilename());
        FileOutputStream fos = new FileOutputStream(convFile);
        fos.write(file.getBytes());
        fos.close();
        return convFile;
    }

    private String generateFileName(MultipartFile multiPart) {
        return new Date().getTime() + "-" + multiPart.getOriginalFilename().replace(" ", "_");
    }

    private void uploadFileTos3bucket(String fileName, File file) {
        s3client.putObject(
                new PutObjectRequest(bucketName, fileName, file).withCannedAcl(CannedAccessControlList.PublicRead));
    }

, и когда я изменяю на Файл на Multipartfile, это показывает мне эту ошибку

enter image description here

Кроме того, если я загружаю multipart непосредственно в корзину s3, выдается ошибка при преобразовании его в файл. И если я преобразую файл в составную часть, чем его исключение (I / O)

1 Ответ

1 голос
/ 25 февраля 2020

Проблема заключается в этом методе:

Нет проблем с S3, вы получаете эту проблему, потому что используете fileOutputstream , вы не указали ни одной папки для записи файла. по умолчанию он записывает файл в папку target в вашем проекте.

private File convertMultiPartToFile(MultipartFile file) throws IOException {
        File convFile = new File(file.getOriginalFilename());
        FileOutputStream fos = new FileOutputStream(convFile);
        fos.write(file.getBytes());
        fos.close();
        return convFile;
}

Поэтому я решил код, создав папку to tomcat сервер , при загрузке. Когда запрос приходит в следующий раз. Я удаляю существующий каталог и создаю его снова только для записи файлов.

Используйте следующий код:

private File convertMultiPartToFile(MultipartFile file) throws IOException {
                deleteDir(new File(NsdlUrlListService.einvoicePath)); //delete a dir

                File files = new File("home/ubuntu/txtgenie/einvoice/"); //create a dir
                if (!files.exists()) {
                    if (files.mkdirs()) {
                        logger.debug("Multiple directories are created!");
                    } else {
                        logger.debug("Failed to create multiple directories!");
                    }
                }

            File convFile = new File(file.getOriginalFilename());
            FileOutputStream fos = new 
                            FileOutputStream("/home/ubuntu/txtgenie/einvoice/"+convFile);

            logger.info(" File Name:: {} ", file);
            String fileName = null;

                byte[] bytes = file.getBytes();
                fileName = file.getOriginalFilename();

                if (!fileName.equals("No file")) {
                    try {
                        BufferedOutputStream bos = new BufferedOutputStream(
                                new FileOutputStream(new File("home/ubuntu/txtgenie/einvoice/" 
                                                      + fileName)));
                        bos.write(bytes);
                        bos.close();
                    }
                      catch (FileNotFoundException fnfe) {
                            logger.debug("File not found" + fnfe);
                        }
                        catch (IOException ioe) {
                            logger.debug("Error while writing to file" + ioe);
                        }
                }
            fos.write(file.getBytes());
            fos.close();
            return convFile;
        }

ДЛЯ удаления dir

private boolean deleteDir(File file) {
    logger.debug("DIR to delete :: " +file);
     if (file.isDirectory()) {
         String[] children = file.list();
         for (int i = 0; i < children.length; i++) {
            boolean success = deleteDir (new File(file, children[i]));
            if (!success) {
               return false;
            }
         }
      }
      logger.debug("The directory : "+file+" : is deleted.");
      return file.delete();
}
...