Problema com acesso a arquivos
15/05/2010 00:00
0
Bom dia. Preciso gravar e ler arquivos no diretório images da minha aplicação Grails. Estou fazendo da seguinte forma:
def originalFile = new File("web-app/images/noticePhotos/temp/image.jpg"

Desta forma funciona quando estou rodando em minha máquina mas depois que gero o war e envio para o serviço de hospegagem não funciona mais, ele não encontra este local, provavelmente porquê no war esta pasta web app não existe. Existe alguma forma de fazer de uma forma que funcione local e no servidor, sem precisar fazer um código diferente para cada? Obrigado.
Tags: Grails


0
Quando uma aplicação está rodando dentro de um arquivo war, não é possível criar arquivos dentro do mesmo diretamente. verifique se no serviço de hospedagem se sua aplicação roda expandida ou dentro do war, caso esteja expandida basta vc mudar o caminho tirando essa pasta "web-app".
15/05/2010 00:00


0
[quote="igorhara"]Quando uma aplicação está rodando dentro de um arquivo war, não é possível criar arquivos dentro do mesmo diretamente. verifique se no serviço de hospedagem se sua aplicação roda expandida ou dentro do war, caso esteja expandida basta vc mudar o caminho tirando essa pasta "web-app".[/quote]

Roda expandida. Mas se eu tirar o web-app não funciona quando estou rodando local, não gostaria de ficar mudando o código toda vez antes de fazer upload. Existe alguma outra forma? Obrigado.
15/05/2010 00:00


0
Tem varias maneiras de fazer isso, uma que eu sempre uso é assim:

def file = new File(servletContext.getRealPath("images/noticePhotos/temp/image.jpg"))


outra coisa, usando o "web-app" não funciona pq a partir do momentos que sua aplicação esteja rodando em produção ela é o web-app, então você teria que acessar os arquivos diretamente "/images/algumacoisa.ss" por exemplo.
15/05/2010 00:00


0
eu recomendo voce gravar/ler os seus arquivos em um diretorio separado. Dessa forma voce pode compartilhar os arquivos com outras aplicações, facilita o backup e vc evita de alguem sobrepor o .war e apagar suas imagens/arquivos.
16/05/2010 00:00


0
[quote="Herrera"]eu recomendo voce gravar/ler os seus arquivos em um diretorio separado. Dessa forma voce pode compartilhar os arquivos com outras aplicações, facilita o backup e vc evita de alguem sobrepor o .war e apagar suas imagens/arquivos.[/quote]

Andei pensando sobre isso e realmente é a melhor opção. Mas não estou conseguindo definir o caminho correto para uma pasta fora do war na minha hospedagem. Quero colocar em uma pasta dentro de httpdocs, mas não está dando certo , recebo o erro "/httpdocs/noticePhotos/temp/temp_29E716811AFAFCA08350A4C367DFA3E2.jpg (No such file or directory)".
17/05/2010 00:00


0
OK, mas você está pegando o contexto da aplicação ou do seu servidor?
se eu não me engano, se você utilizar o '/' direto vai pegar o contexto da aplicação e como a pasta htdocs não está na aplicação não vai funcionar!
17/05/2010 00:00


0
[quote="Quantum"][quote="Herrera"]eu recomendo voce gravar/ler os seus arquivos em um diretorio separado. Dessa forma voce pode compartilhar os arquivos com outras aplicações, facilita o backup e vc evita de alguem sobrepor o .war e apagar suas imagens/arquivos.[/quote]

Andei pensando sobre isso e realmente é a melhor opção. Mas não estou conseguindo definir o caminho correto para uma pasta fora do war na minha hospedagem. Quero colocar em uma pasta dentro de httpdocs, mas não está dando certo , recebo o erro "/httpdocs/noticePhotos/temp/temp_29E716811AFAFCA08350A4C367DFA3E2.jpg (No such file or directory)".[/quote]

Já estou conseguindo gravar em um diretório fora da aplicação, agora estou em dúvida sobre como renderizar esta imagem que está fora da app em um GSP.
17/05/2010 00:00


0
<!-- m --><a class="postlink" href="http://www.intelligrape.com/blog/2009/04/16/grails-upload-and-render-file/">http://www.intelligrape.com/blog/2009/0 ... nder-file/</a><!-- m -->
como renderizar.

Acho que versão 1.2.x do grails dava para você somente usar um comando
render file.text

Mas não sei se fui eu que alterei algo no meu projeto ou se na versão 1.3 não da mais, ou se foi por acaso que eu consegui fazer isso!
17/05/2010 00:00


0
Se não funcionar, tente desta maneira, convertendo a imagem remota em um file.
	def testeImagem = {
def file = new File(&quot;logo.gif&quot;)

use (FileBinaryCategory)
{
file << &quot;http&#58;//www.google.com/images/logo.gif&quot;.toURL()
}

response.outputStream << file.bytes
}


Agora o FileBinaryCategory é uma outra classe que cuida dessa parte de inputStream para nós:
class FileBinaryCategory
{
def static leftShift(File a_file, URL a_url)
{
def input
def output

try
{
input = a_url.openStream()
output = new BufferedOutputStream(new FileOutputStream(a_file))

output << input
}
finally
{
input?.close()
output?.close()
}
}
}


funcionou perfeitamente aqui!
18/05/2010 00:00


0
Consegui renderizar a imagem com o seguinte código:
def byte[] getBytesFromFile(File file) throws IOException {
InputStream is = new FileInputStream(file);

// Get the size of the file
long length = file.length();

if (length > Integer.MAX_VALUE) {
println &quot;File is too large&quot;
}

// Create the byte array to hold the data
byte[] bytes = new byte[(int)length];

// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&amp;&amp; (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}

// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException(&quot;Could not completely read file &quot;+file.getName());
}

// Close the input stream and return bytes
is.close();
return bytes;
}


Muito obrigado a todos pela ajuda.
19/05/2010 00:00



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto