Переменный путь для файлового хранилища на основе группы пользователя - PullRequest
0 голосов
/ 27 мая 2020

Я работаю над приложением, которое позволяет пользователям загружать файлы. Я хочу, чтобы загруженные файлы были организованы в заранее созданные папки с именем группы, к которой принадлежит пользователь. Кажется, я не могу найти способ сделать путь редактируемым, чтобы я мог передать имя группы в метод в качестве параметра и сохранить файл в этом каталоге.

Вот моя последняя попытка, которая приводит к исключение «Не удалось сохранить файл файла] с root причиной».

@Service
public class StorageServiceImpl implements StorageService {

    @Value("${upload.path}")
    private Path path;

    public void uploadFile(MultipartFile file,String contentName, String groupName){
        //make so that files are stored in path/groupname
        this.path = Paths.get(this.path.toString() +"/"+groupName +"/");
        String filename = contentName+"-"+StringUtils.cleanPath(file.getOriginalFilename());
        System.out.println("\n\n\n\n\n"+filename + "\n\n\n");
        try {
            if (file.isEmpty()) {
                throw new StorageException("Failed to store empty file");
            }
            if (filename.contains("..")) {
                // This is a security check
                throw new StorageException(
                        "Cannot store file with relative path outside current directory "
                                + filename);
            }
            try (InputStream inputStream = file.getInputStream()) {
                System.out.println("\n\n\n\n\n"+this.path.resolve(filename) + "\n\n\n");
                Files.copy(inputStream, this.path.resolve(filename), StandardCopyOption.REPLACE_EXISTING);
            }
        }catch (IOException e) {
                String msg = String.format("Failed to store file %s", file.getName());
                throw new StorageException(msg, e);
            }
    }
}

Примечание: если каталог groupName создается до запуска этого метода (поскольку я намерен создать его при создании группы), тогда метод пытается сохранить файл в другом каталоге группы. то же имя внутри этого каталога, например:

backend / src / main / webapp / WEB-INF / TestGroup / TestGroup / test.jpg

Посмотрите, как TestGroup появляется дважды

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Я заставил его работать, используя метод absolutePath из частного пути Path для генерации строки.

public void uploadFile(MultipartFile file,String contentName, String groupName){
        //make so that files are stored in path/groupname
        String filename = contentName+"-"+StringUtils.cleanPath(file.getOriginalFilename());
        File uploadFilePath = Paths.get(this.path.toAbsolutePath() + "/" + groupName+"/" + filename).toFile();
        try {
            if (file.isEmpty()) {
                throw new StorageException("Failed to store empty file");
            }
            if (filename.contains("..")) {
                // This is a security check
                throw new StorageException(
                        "Cannot store file with relative path outside current directory "
                                + filename);
            }
            try (InputStream inputStream = file.getInputStream();OutputStream out = new FileOutputStream(uploadFilePath);) {


                FileCopyUtils.copy(inputStream,out);
            }
        }catch (IOException e) {
                String msg = String.format("Failed to store file %s", file.getName());
                throw new StorageException(msg, e);
            }
    }
0 голосов
/ 27 мая 2020

Вместо этого вы пытаетесь ввести значение в переменную типа Path.

@Value("${upload.path}")
private Path path;

как насчет чтения значения в строковую переменную и сохранения его как File, а затем используя его для загрузки, как показано ниже,

@Value("${upload.path}")
private String path;

А затем используя его

public void uploadFile( MultipartFile file, String contentName, String groupName )
{
    String filename = contentName + "-" + StringUtils.cleanPath( file.getOriginalFilename() );
    // use a File object here
    File uploadFilePath = Paths.get( new File( path ).getPath() + "/" + groupName + "/" + filename ).toFile();
    try
    {
        try( InputStream in = file.getInputStream(); OutputStream out = new FileOutputStream( uploadFilePath ) )
        {
            // Leverage the support of Spring's FileCopyUtils Here
            FileCopyUtils.copy( in, out );
        }
        catch( IOException ex )
        {
            throw new RuntimeException( ex );
        }
    }
    catch( IOException e )
    {
        String msg = String.format( "Failed to store file %s", file.getName() );
        throw new StorageException( msg, e );
    }
}
...