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
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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
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!
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?