Inquiridor
Problema <input type="file"> no google chrome

Pergunta
-
Estou com o seguinte problema:
Tenho uma tag <input type="file"> em uma página aspx, onde está a minha aplicação silverlight.
Dentro da minha aplicação silverlight preciso disparar o evento "click" desse "input" para abrir a caixa de diálogo p/ selecionar um arquivo. Após selecionado o arquivo, preciso recuperar o caminho completo do arquivo para salvar esse caminho no banco de dados.
No IE funciona normalmente, porém no Chrome não dispara o evento "click" e com isso não abre a caixa de seleção do arquivo.
Segue o código:
No aspx:
<input id="fileDialog" type="file" />
No Silverlight:
HtmlElement fileUpload = HtmlPage.Document.GetElementById("fileDialog");
fileUpload.Invoke("click");
String pathCompleto = fileUpload.GetAttribute("value");
Tentei fazer isso com o componente do próprio silverlight "OpenFileDialog", mas ele não permite recuperar o caminho completo do arquivo por questões de segurança do silverlight.
Alguém sabe como driblar esse problema do chrome, e se não tiver solução para o browser, alguma outra sugestão ?
Agradeço desde já.
segunda-feira, 29 de abril de 2013 21:39
Todas as Respostas
-
Boa Tarde Rafael,
Está é uma questão bem delicada a se tratar, isso por que aparentemente esse problema não vai acontecer somente no Chrome. Um fato estranho durante os testes que eu fiz em cima de sua pergunta é que utilizando o exemplo deste site:
http://www.richardkotze.com/top-tips/how-to-open-file-dialogue-just-using-javascript
Quando limpava a tela, o click do input file funcionava. Quando eu fazia a mesma solução, mas não apagando form e silverlight e afins, não funcionava.
Eu também achei estranho o fato de o caminho do arquivo estar a um passo do desenvolvedor e mesmo assim, não poder ser acessado no Silverlight. Existe uma variável FileSystemInfo (Classe base do FileInfo) chamada FullPath que contém a informação que você precisa. O problema é que ela está protegida e mesmo via reflection não vai conseguir pegar ela. Outro problema é que o OpenFileDialog não herda de nenhuma classe e é sealed e para ajudar utiliza bibliotecas internas do .net, o que quebra de certa forma o método, customizar o OpenFileDialog e afins.
Não deixei de observar que você utilizou a palavra upload no código que colocou de exemplo. Se você for fazer um upload no silverlight de um arquivo, não é necessário o caminho do arquivo (não vai servir de nada, se você não pode acessar a máquina do cliente a não ser que o silverlight esteja fora do browser). O upload de arquivos pode ser feito via Stream.
http://www.c-sharpcorner.com/uploadfile/nipuntomar/file-upload-in-silverlight/
http://msdn.microsoft.com/en-us/library/cc221415(v=vs.95).aspx
Se precisar simplesmente ter os bytes, o esquema é mesmo do Stream que já existe desde o framework 1.1.
Espero que ajude,
Samuel Fabel
segunda-feira, 6 de maio de 2013 18:03 -
Obrigado pela resposta Samuel.
O que eu preciso é realmente o caminho completo do arquivo selecionado, pois ele vai ser salvo no banco de dados. Depois disso uma outra aplicação (.exe) recupera esse caminho e carrega o arquivo.
terça-feira, 7 de maio de 2013 21:13 -
Bom Dia Rafael,
Não sei qual é a versão do silverlight que você está usando, mas vou sugerir isso mesmo assim:
Uma das novidades que surgiram com o Silverlight 4 foi permitir aplicações silverlight out-browser. Nas configurações desta aplicação tem um check chamado "Require elevated trust when outsite the browser" e quando você está na aplicação se a flag "Application.Current.HasElevatedPermissions" estiver true, você consegue ver as informações completadas do arquivo.
No Silverlight 5, existe uma novidade para esta mesma funcionalidade: existe a opção da aplicação silverlight rodar com uma permissão elevada dentro do browser. Segue um link desta funcionalidade e um post que fala do assunto:
http://msdn.microsoft.com/en-us/library/ee721083(v=vs.95).aspx
http://justlikeamagic.com/2011/05/18/new-in-silverlight5-elevated/
Samuel Fabel
quarta-feira, 8 de maio de 2013 15:41 -
Obrigado Samuel. Uso o Silverlight 4. Vou dar uma olhada no Silverlight 5, parece ser a solução mais viável.
Obrigado pela ajuda !
sexta-feira, 10 de maio de 2013 18:25