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á 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?