Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Upload com SpringMVC

Olá boa tarde, no curso de SpringMVC o prof faz o envio das imagens e salva a url relativa no banco, como eu posso recuperar a imagem agora, pelo path salvo no banco e exibir as imagens na home.jsp

4 respostas

Olá Cleusa, tudo bem ?

Você pode ter uma classe que te auxilie no carregamento desses arquivos pra aplicação usando i/o buscando através do caminho salvo na base. Como o contexto da explicação gira em torno de upload, e não no uso desses recursos posteriormente, teríamos esse trabalho a mais.

Uma outra possibilidade, (mais recomendada caso você precise de acesso facilitado a esses recursos) seria ter algum servidor de arquivos expondo esses recursos através de urls publicas, ou algum serviço equivalente.

Em geral o pessoal usa muito o S3 da Amazon (Simple Storage Service) pra isso. Tem também um serviço que emula a api do S3 pra fins de teste e desenvolvimento -> S3 Ninja. Vale a pena dar uma olhada.

Espero ter ajudado. Abraço!

Como seria pelo S3 amazon , no controller eu enviaria a imagem, e como eu associaria a imagem ao Produto nesse caso, eu salvaria o Path da imagem no S3 amazon ao produto?? eu nunca tive necessidade de criar um codigo de upload, agora to construindo uma loja utilizando SPRING e não to entendendo muito bem não

Oi Cleusa,

Então, a ideia é a mesma. Você poderia ter um controller, ou melhor, uma classe separada que encapsule esse trabalho de lidar com o S3 (como um repositório). Essa classe usaria a api do S3 justamente pra fazer esse trabalho. Enviar o recurso para a Amazon (ou no caso de teste S3 ninja, para o serviço que esta rodando na sua própria máquina) e pegar a uri que o mesmo te devolve. Essa uri então pode ser salva como path do livro no seu banco de dados pra quando você quiser acessar futuramente.

O uso da api pode ser verificado na própria documentação. O repositório aberto do livro de Spring MVC da casa do código também tem um exemplo de uso da api do S3 -> repo. A classe FileSaver já trabalha da maneira comentada acima.

Abraço!

solução!

Rafael Rollo ainda tenho uma duvida olha segue o

Dependencias do S3 Ninja

            <!-- s3ninja -->
        <dependency>
            <groupId>com.scireum</groupId>
            <artifactId>s3ninja</artifactId>
            <version>2.3.2</version>
        </dependency>

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk</artifactId>
            <version>1.9.11</version>
        </dependency>

        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>http://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>

            <repository>
                <id>sonatype-oss-public</id>
                <url>http://oss.sonatype.org/content/groups/public/</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>

Classe de Configuracao do S3AmazonClient


public class AmazonConfiguration {

    @Bean
    public AmazonS3Client s3Ninja() {
        AWSCredentials credentials = new BasicAWSCredentials(
                "AKIAIOSFODNN7EXAMPLE",
                "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY");
        AmazonS3Client newClient = new AmazonS3Client(credentials,
                new ClientConfiguration());
        newClient.setS3ClientOptions(new S3ClientOptions()
                .withPathStyleAccess(true));
        newClient.setEndpoint("http://localhost:9444/s3");
        return newClient;

    }    
}

SerlvetMVCSpring Eu add AmazonConfiguration

public class ServletSpringMVC extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { SecurityConfiguration.class,
                AppWebConfiguration.class, JPAConfiguration.class,
                JPAProductionConfiguration.class,AmazonConfiguration.class };
    }


    // codigo omitido...
}

** Ai no FileSaver

@Component
public class FileSaver {

    @Autowired
    private AmazonS3Client s3;

    public String write(String baseFolder, MultipartFile multipartFile) {
        try {
            s3.putObject("casadocodigo", multipartFile.getOriginalFilename(),
                    multipartFile.getInputStream(), new ObjectMetadata());
            return "http://localhost:9444/s3/casadocodigo/"+multipartFile.getOriginalFilename()+"?noAuth=true";
        } catch (AmazonClientException | IOException e) {
            throw new RuntimeException(e);
        }

    }


}

** Método controller

@RequestMapping(method=RequestMethod.POST)
    @CacheEvict(value="lastProducts", allEntries=true)
    public ModelAndView save(MultipartFile summary,@ModelAttribute("product") @Valid Product product,BindingResult bindingResult,RedirectAttributes redirectAttributes) throws IOException{
        if(bindingResult.hasErrors()){
            return form(product);
        }

        //Sera que passo o product como parametro?
        String webPath = fileSaver.write("uploaded-images",summary);
        product.setSummaryPath(webPath);
        products.save(product);

        redirectAttributes.addFlashAttribute("success", "Produto cadastrado com sucesso");
        return new ModelAndView("redirect:produtos");
    }

Como eu consigo essas crendenciais?, Eu tenho que acessar http://localhost:9444/s3?, eu tento mais não consigo. Esta faltando mais alguma configuração?