Importante

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!

12
respostas

ERRO NO MÉTODO

Estou com erro no método quando chega na linha:

 file.transferTo(new File(path));
public String write(String baseFolder, MultipartFile file) {
    try {
        String realPath = request.getServletContext().getRealPath("/"+baseFolder);
        String path = realPath + "/" + file.getOriginalFilename();
        file.transferTo(new File(path));
        return baseFolder + "/" + file.getOriginalFilename();

    } catch (IllegalStateException | IOException e) {
        throw new RuntimeException(e);
    }
}

O meu realPath vem assim:

C:\DEV\PROJETOS\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\mercadinho-jt\arquivos-produto

E o Path fica assim:

C:\DEV\PROJETOS\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\mercadinho-jt\arquivos-produto/Tomate-destaque.jpg

Se reparar a barra está ao contrário.. Também gostaria de saber se pelo fato do projeto está dentro do C: na hora de transferir a imagem da erro?.

12 respostas

Daniel,

Experimente este código dentro do bloco try:

String realPath = request.getServletContext().getRealPath("\"+baseFolder);
        String path = realPath + "\" + file.getOriginalFilename();
        file.transferTo(new File(path));
        return baseFolder + "\" + file.getOriginalFilename();

Creio que o seu problema seja a confusão entre usar '/' ou '\' para o path e acessar arquivos.

Erick, Então se deixo com essa barra "\" já da erro na primeira linha e se coloco duas \ o erro some, mas o erro ocorre na mesma linha.

file.transferTo(new File(path));

Experimente então "\"

Duas barras assim indica para o compilador que você quer realmente utilizar a barra invertida.

Copiei exatamente o trecho que você falou, mas acusa erro por conta da barra.

Desculpe. A formatação modificou o que iria responder.

Experimente usar: "\\"

Coloquei as duas barras. Mais o erro continua na mesma linha.

O caminho que é pego é o seguinte:

C:\DEV\PROJETOS\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\mercadinho-jt\arquivos-produto\Tomate-destaque.jpg

Será que não é o caminho que possa ser o problema? Pqe se eu vou no properties da pasta arquivos-produto é assim que está:

Path:

/mercadinho-jt/src/main/webapp/arquivos-produto

Location:

C:\DEV\PROJETOS\mercadinho-jt\src\main\webapp\arquivos-produto

Acabou dando certo dessa forma:

public String write(String baseFolder, MultipartFile file) {
        try {            
                    //String realPath = request.getServletContext().getRealPath("\\" + baseFolder);
                    String path = "C:\\DEV\\PROJETOS\\mercadinho-jt\\src\\main\\webapp\\arquivos-produto" + "\\" + file.getOriginalFilename();
                    file.transferTo(new File(path));
                    return baseFolder + "\\" + file.getOriginalFilename();

        } catch (IllegalStateException | IOException e) {
            throw new RuntimeException(e);
        }
    }

Sei que não é a melhor forma de se fazer, definindo o caminho. Mais pelo visto é realmente o caminho que é pego no request. Alguém sabe como posso corrigir isso..

Daniel, você afirma que dá erro ao executar o método file.transferTo(new File(path));, no entanto eu fiz os testes e usei o mesmo código da sua dúvida e gravou normal e até retornou a barra invertida, igual o resultado da sua variável path. Vendo a variável path String path = "C:\\DEV\\PROJETOS\\mercadinho-jt\\src\\main\\webapp\\arquivos-produto" de sua última postagem posso deduzir que sua pasta "arquivos-sumario" não está publicada no servidor, ou seja, você a criou manualmente nesse caminho que está na variável path. Pode confirmar isso?

Thiago, bom dia. Então criei a pasta da mesma forma que é mostrada no curso, ou seja, não fui lá na pasta do projeto e criei lá. Então o que acontece é que nessa linha:

String realPath = request.getServletContext().getRealPath("\"+baseFolder);

Acaba vindo dessa forma:

C:\DEV\PROJETOS\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\mercadinho-jt\arquivos-produto

Depois disso é concatenada a imagem que se eu deixar da forma como é mostrada no curso fica assim:

        String path = realPath + "\" + file.getOriginalFilename();

E o path acaba vindo dessa forma (observe a barra invertida)

C:\DEV\PROJETOS\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\mercadinho-jt\arquivos-produto/Tomate-destaque.jpg

Ai quando chega na linha:

 file.transferTo(new File(path));

Já cai na exception. Verifiquei isso debugando a aplicação, estou usando o eclipse Luna para fazer o curso. Gostaria de saber se o realPath quando é pego teria que vir dessa forma mesmo?

Obrigado!!

O mesmo está acontecendo comigo.

java.io.IOException: java.io.FileNotFoundException: C:\dev\projects\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\casadocodigo\arquivos-sumario\C:\Users\Starke\Desktop\fotos_isa.txt (A sintaxe do nome do arquivo, do nome do diretório ou do rótulo do volume está incorreta)

Alguém conseguiu solucionar ?

comigo está acontecendo a mesma coisa.

GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: java.io.IOException: java.io.FileNotFoundException: C:\Users\SND14182\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\casadocodigo\arquivos-sumario\download.png (O sistema não pode encontrar o caminho especificado)] with root cause
java.io.FileNotFoundException: C:\Users\SND14182\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\casadocodigo\arquivos-sumario\download.png (O sistema não pode encontrar o caminho especificado)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(Unknown Source)

Criei a pasta conforme orientado no video, porém se eu entrar na url

C:\Users\SND14182\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\casadocodigo\

não existe a pasta "arquivos-sumario" somente "WEB-INF" e "META-INF"

Alguem que usa Windows conseguiu resolver isto? no video o instrutor resolve usando o "Clean" mas isto não funcionou aqui

Acabei de resolver criando a pasta "arquivos-sumario" na pasta temporaria =(. parece que o eclipse bugou e não criou automaticamente.