Многочастная ошибка файла - PullRequest
0 голосов
/ 02 июля 2018

Я хочу загрузить многокомпонентный файл в AWS S3. Итак, я должен преобразовать это. Но новому методу File требуется локальное расположение, чтобы получить файл. Я умею делать по-местному. Но запуск этого кода на каждой машине кажется проблемой.

Пожалуйста, найдите оба сценария.

Рабочая

private File convertMultiPartToFile(MultipartFile multipartFile) throws IOException {
    File convFile = new File("C:\\Users\\" + multipartFile.getOriginalFilename());
    multipartFile.transferTo(convFile);     
    return convFile;
}       

Не работает

private File convertMultiPartToFile(MultipartFile multipartFile) throws IOException {
    File convFile = new File(multipartFile.getOriginalFilename());
    multipartFile.transferTo(convFile);
    return convFile;
}   


Error received :

java.io.FileNotFoundException: newbusiness.jpg (Access is denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:162)

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

У вас проблемы с относительным Paths

Вы можете сделать это

public class UploadStackoverflow {

    private String location = "upload-dir";
    private Path rootLocation;

    public File convertFile(MultipartFile file) throws IOException {

        rootLocation = Paths.get(location);
        Files.createDirectories(rootLocation);
        String filename = StringUtils.cleanPath(file.getOriginalFilename());
        InputStream inputStream = file.getInputStream();
        Files.copy(inputStream, this.rootLocation.resolve(filename),
                StandardCopyOption.REPLACE_EXISTING);

        return new File(this.rootLocation.resolve(filename).toAbsolutePath().toString());

    }
}
0 голосов
/ 06 июля 2018

Поскольку для размещения файлов требуется временное местоположение. Ниже код работал после развертывания войны на AWS.

private File convertMultiPartToFile(MultipartFile multipartFile) throws IOException {
        File convFile = new File(System.getProperty("java.io.tmpdir") + System.getProperty("file.separator") + 
                multipartFile.getOriginalFilename());
        multipartFile.transferTo(convFile);
        return convFile;
    }   
0 голосов
/ 03 июля 2018

Вы можете использовать Spring Content S3 . Это скроет детали реализации, поэтому вам не нужно о них беспокоиться.

Существуют альтернативные варианты Spring Boot, но поскольку вы не используете Spring Boot, добавьте следующую зависимость в ваш pom.xml

pom.xml

    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-s3</artifactId>
        <version>0.0.11</version>
    </dependency>

Добавьте следующую конфигурацию, которая создает компонент SimpleStorageResourceLoader:

@Configuration
@EnableS3Stores
public class S3Config {

    @Autowired
    private Environment env;

    public Region region() {
        return Region.getRegion(Regions.fromName(env.getProperty("AWS_REGION")));
    }

    @Bean
    public BasicAWSCredentials basicAWSCredentials() {
        return new BasicAWSCredentials(env.getProperty("AWS_ACCESS_KEY_ID"), env.getProperty("AWS_SECRET_KEY"));
    }

    @Bean
    public AmazonS3 client(AWSCredentials awsCredentials) {
        AmazonS3Client amazonS3Client = new AmazonS3Client(awsCredentials);
        amazonS3Client.setRegion(region());
        return amazonS3Client;
    }

    @Bean
    public SimpleStorageResourceLoader simpleStorageResourceLoader(AmazonS3 client) {
        return new SimpleStorageResourceLoader(client);
    }
}

Создать "Магазин":

S3Store.java

public interface S3Store extends Store<String> {
}

Подключите этот магазин туда, куда вам нужно загрузить ресурсы:

@Autowired
private S3Store store;

WritableResource r = (WritableResource)store.getResource(getId());
InputStream is = // plug your input stream in here
OutputStream os = r.getOutputStream();
IOUtils.copy(is, os);
is.close();
os.close();

Когда ваше приложение запускается, оно увидит зависимость от spring-content-s3 и вашего S3Store интерфейса и предоставит вам реализацию, поэтому вам не нужно беспокоиться о реализации этого самостоятельно.

Если вы пишете какое-то веб-приложение или микросервис и вам нужен REST API, вы также можете добавить эту зависимость:

    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-rest</artifactId>
        <version>0.0.11</version>
    </dependency>

Обновите S3Config.java следующим образом:

@Configuration
@EnableS3Stores
@Import(RestConfiguration.class)
public class S3Config {
...

Обновите ваш магазин следующим образом:

S3Store.java

@StoreRestResource(path="s3docs")
public interface S3Store extends Store<String> {
}

Теперь, когда ваше приложение запускается, оно увидит ваш Store интерфейс, а также внедрит реализацию @Controller, которая перенаправит запрос REST в ваш магазин. Это заменяет код автопроводки, приведенный выше, очевидно.

Тогда:

curl -X POST /s3docs/example-doc

с запросом multipart / form-data сохранит изображение в s3.

curl /s3docs/example-doc

получит его снова и так далее. Кстати, этот контроллер поддерживает полное CRUD и потоковое видео.

Если вы хотите связать этот «контент» с сущностью JPA или чем-то в этом роде, вы можете использовать расширение S3Store AssociateStore или ContentStore, и у вас есть дополнительные доступные методы, которые предоставляют связи.

Есть несколько руководств по началу работы здесь . Справочное руководство по s3 здесь . И здесь есть обучающее видео здесь . Кодовый бит начинается примерно на полпути.

НТН

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