Это весеннее приложение выполняет простую загрузку файлов,

Вот класс контроллера

    @Override
        public String fileUpload(MultipartFile file) {
    
            try{
                
                // save uploaded image to images folder in root dir
                Files.write(Paths.get("images/"+ file.getOriginalFilename()), file.getBytes());
                
                // perform some tasks on image 
                return "";
    
            } catch (IOException ioException) {
                
                return "File upload has failed.";
            } finally {
                Files.delete(Paths.get("images/" + file.getOriginalFilename()));
            }
        }

Но когда я создаю jar и запускаю, он выдает исключение IOException, говоря, java.nio.file.NoSuchFileException: images\8c9.jpeg.

Итак, мой вопрос в том, как я могу добавить папку изображений внутри самого исполняемого файла jar.

Спасибо.

0
pl-jay 24 Окт 2020 в 08:49

1 ответ

Лучший ответ

Вы должны указать полный путь к папке изображений или сохранить в java.io.tmpdir, создав сначала папку изображений.

Но, на мой взгляд, для большей гибкости вам следует настроить папку загрузки из файла конфигурации. Взгляните на это.

app:
   profile-image:
      upload-dir: C:\\projs\\web\\profile_image
      file-types: jpg, JPG, png, PNG
      width-height: 360, 360
      max-size: 5242880

В своей службе или контроллере делайте все, что хотите, например, проверяйте тип, размер и т. Д. Изображения и обрабатывайте его по своему усмотрению. Например, если вам нужны эскизы (или аватар ..).

В вашем контроллере или классе службы получите каталог:

@Value("${app.image-upload-dir:../images}")
private String imageUploadDir;

В заключение,

public static Path uploadFileToPath(String fullFileName, String uploadDir, byte[] filecontent) throws IOException {
    Path fileOut = null;
    try{
        Path fileAbsolutePath = Paths.get(StringUtils.join(uploadDir, File.separatorChar, fullFileName));
        fileOut = Files.write(fileAbsolutePath, filecontent);
    }catch (Exception e) {
        throw e;
    }
    return fileOut; //full path of the file
}

Отвечая на ваш вопрос в комментарии: вы можете использовать метод java.io.File.deleteOnExit(), который удаляет файл или каталог, определенный абстрактным именем пути, когда виртуальная машина завершает работу . ОБРАТИТЕ ВНИМАНИЕ: при неправильном обращении могут остаться некоторые файлы.

try (ByteArrayOutputStream output = new ByteArrayOutputStream();){
    URL fileUrl = new URL(url);
    String tempDir = System.getProperty("java.io.tmpdir");
    String path = tempDir + new Date().getTime() + ".jpg"; // note file extension 
    java.io.File file = new java.io.File(path); 
    file.deleteOnExit();
    
    inputStream = fileUrl.openStream();
    ByteStreams.copy(inputStream, output); // ByteStreams - Guava
    outputStream = new FileOutputStream(file);
    output.writeTo(outputStream);
    outputStream.flush();
    return file;
} catch (Exception e) {
    throw e;
} finally {
    try {
    if(inputStream != null) {
        inputStream.close();
    }
    if(outputStream != null) {
        outputStream.close();
    }
    } catch(Exception e){
        //skip
    }
}
1
Aman 24 Окт 2020 в 08:52