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

Guardar Foto no Servidor

Bom dia a todos. Agradeceria ajuda. No meu adminBooksBean eu utilizo a classe FileSaver para salvar o arquivo da foto, até aí tudo bem. Mas como faço para enviar a foto para uma pasta dentro do meu projeto e salvar no BD o caminho dela para poder exibir na pagina de listagem do produto list.xhtml. Esta pasta eu tenho que colocar em que diretório do projeto e onde referencia-la. Obrigado.

@Model
public class AdminBooksBean {
...
private Part summary;
@Inject
private FileSaver fileSaver;
@Transactional
public String save(){
String summaryPath =
fileSaver.write("summaries", summary);
...
}
}

arquivo FileSaver

@RequestScoped
public class FileSaver {
@Inject
private HttpServletRequest request;
private static final String CONTENT_DISPOSITION =
"content-disposition";
private static final String FILENAME_KEY = "filename=";
public String write(String baseFolder, Part multipartFile)
{
String serverPath = request.getServletContext()
.getRealPath("/" + baseFolder);
String fileName = extractFilename(multipartFile
.getHeader(CONTENT_DISPOSITION));
String path = serverPath + "/" + fileName;
try {
multipartFile.write(path);
} catch (IOException e) {
throw new RuntimeException(e);
}
return baseFolder + "/" + fileName;
}
private String extractFilename(String contentDisposition)
{
if (contentDisposition == null) {
return null;
}
int startIndex = contentDisposition
.indexOf(FILENAME_KEY);
if (startIndex == -1) {
return null;
}
String filename = contentDisposition
.substring(startIndex
+ FILENAME_KEY.length());
if (filename.startsWith("\"")) {
int endIndex = filename.indexOf("\"", 1);
if (endIndex != -1) {
return filename.substring(1, endIndex);
}
} else {
int endIndex = filename.indexOf(";");
if (endIndex != -1) {
return filename.substring(0, endIndex);
}
}
return filename;
}
}
2 respostas
solução!

Fala Sérgio, tudo bem?

Sugiro utilizar a lib Commons Fileupload da Apache, vai facilitar esse processo de upload de imagens =) http://commons.apache.org/proper/commons-fileupload/

oi Otávio muito obrigado pelo seu retorno. Entrei no Fileupload da Apache e parecia muito simples, mas a configuração no arquivo FileSaver não estou conseguindo fazer eles dizem no site que a configuração, se eu entendi, seria somente esta, fazer o xhtml virar multipart, como estou utilizando maven inclui uma dependency do commons fileupload e por fim configurar o filesaver mas não estou conseguindo, o filesaver está mostrando vários erros veja se fiz corretamente meus arquivos abaixo:

este é o filesaver onde me parece que estou esquecendo algo no campo factory.setRepository(repository); este é o erro que aparece: Multiple markers at this line

- Syntax error, insert ")" to complete MethodDeclaration
- Syntax error on token ".", @ expected after this token
- Syntax error, insert "SimpleName" to complete 
 QualifiedName
import java.io.File;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileSaver {

    private HttpServletRequest request;

    // Check that we have a file upload request
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    // Create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();

    // Configure a repository (to ensure a secure temp location is used)
    ServletContext servletContext = this.getServletConfig().getServletContext();
    File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
    factory.setRepository(repository);

    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);

    // Parse the request
    List<FileItem> items = upload.parseRequest(request);

    private ServletRequest getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

}

este é o form.xhtml

<div>
            <h:outputLabel value="Capa do livro"/>
           <h:inputFile id="cover" value="#{adminBooksBean.cover}" label="Capa do livro" />
       </div>
<h:commandButton value="Gravar" action="#{adminBooksBean.save}" />

este é o AdminBooksBean na parte das fotos:

private Part cover;
    @Inject
    private FileSaver fileSaver;
     public void setCover(Part cover) {
        this.cover = cover;
    }

    public Part getCover() {
        return cover;
    }

este é a classe Book

private String coverPath;
     public String getCoverPath() {
        return coverPath;
    }
     public void setCoverPath(String coverPath) {
        this.coverPath = coverPath;
    }