Enviar Archivos con Servicio Web

20/12/2005 - 01:26 por Fran | Informe spam
Hola.
Alguien podria decirme si es posible enviar archivos desde el servidor al
cliente utilizando un servicio web?, en caso afirmativo, podriais orientarme
sobre como podria hacerlo o que clases o métodos deberia de utilizar o donde
buscar informacion al respecto?.

Un saludo.

Preguntas similare

Leer las respuestas

#1 A.Poblacion
20/12/2005 - 08:01 | Informe spam
"Fran" wrote in message
news:%
Alguien podria decirme si es posible enviar archivos desde el servidor al
cliente utilizando un servicio web?, en caso afirmativo, podriais
orientarme sobre como podria hacerlo o que clases o métodos deberia de
utilizar o donde buscar informacion al respecto?.



Tienes que leer el contenido del archivo a una variable (por ejemplo, un
array de bytes), y devolver esa variable en una llamada al servicio web. El
cliente toma la variable y vuelve a grabar el contenido en un archivo.
Respuesta Responder a este mensaje
#2 Víctor
20/12/2005 - 10:35 | Informe spam
Hola,

te envío un ejemplo de un servicio web que he realizado. Ha sido
desarrollado utlilizando Web Services Enhancements 2.0 (WSE 2.0), el
problema es que no se permite la manipulación de archivos demasiado grandes,
pero esto ha sido modificado con MTOM para WSE 3 y .NET 2.0, echale un
vistazo si quieres porque cambia la forma de hacerlo. Recuerda añadir los
namespaces necesarios para WSE 2.0.

En el ejemplo que te envío, el cliente solicita un archivo al servidor. El
servidor crea un directorio temporal con nombre nombre de fichero + "_tmp" y
divide el archivo en varias partes (para transmitir ficheros más pequeños),
a continuación le devuelve al cliente el número de subarchivos que ha
creado. De esta forma, el cliente hace un bucle pidiendole al servidor cada
subfichero por el número de orden que ocupa en el directorio temporal:

[WebMethod (Description="Devuelve el fichero con índice \"i\" del
directorio")]
public int DownloadChunk(string ruta, int i)
{
int result;
try
{
string tmpPath = ruta + @"_tmp";

dirInfo=new DirectoryInfo(tmpPath);

DimeAttachment dimeAttach = new DimeAttachment("image/gif",
TypeFormat.MediaType, dirInfo.GetFiles()[i].FullName);
ResponseSoapContext.Current.Attachments.Add(dimeAttach);
result=0;
}
catch(Exception exc)
{
result=1;
}
return result;
}


El código del bucle de la función en la parte cliente sería el siguiente:

//numFiles es el número total de subarchivos
//ws es el servicio web
//progBar es una barra de progreso

for(int i=0; i<numFiles; i++)
{
progBar.Value=i+1;
ws.ResponseSoapContext.Attachments.Clear();
if(ws.DownloadChunk(user, ficRemoto, i)==0)
{
//Obtiene el archivo descargado del WebService
Stream stream=ws.ResponseSoapContext.Attachments[0].Stream;

string indice="000" + (i+1).ToString();
string splFile= localFile + "." + indice.Substring(indice.Length-3,3);

FileStream f = System.IO.File.OpenWrite(splFile);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Close();
f.Write(bytes, 0, bytes.Length);
f.Close();
}
else throw new Exception("Error obteniendo el archivo");
}


Un saludo.
Víctor.
Respuesta Responder a este mensaje
#3 Fran
21/12/2005 - 17:30 | Informe spam
Gracias por la informacion Victor.

Un saludo

"Víctor" escribió en el mensaje
news:
Hola,

te envío un ejemplo de un servicio web que he realizado. Ha sido
desarrollado utlilizando Web Services Enhancements 2.0 (WSE 2.0), el
problema es que no se permite la manipulación de archivos demasiado
grandes,
pero esto ha sido modificado con MTOM para WSE 3 y .NET 2.0, echale un
vistazo si quieres porque cambia la forma de hacerlo. Recuerda añadir los
namespaces necesarios para WSE 2.0.

En el ejemplo que te envío, el cliente solicita un archivo al servidor. El
servidor crea un directorio temporal con nombre nombre de fichero + "_tmp"
y
divide el archivo en varias partes (para transmitir ficheros más
pequeños),
a continuación le devuelve al cliente el número de subarchivos que ha
creado. De esta forma, el cliente hace un bucle pidiendole al servidor
cada
subfichero por el número de orden que ocupa en el directorio temporal:

[WebMethod (Description="Devuelve el fichero con índice \"i\" del
directorio")]
public int DownloadChunk(string ruta, int i)
{
int result;
try
{
string tmpPath = ruta + @"_tmp";

dirInfo=new DirectoryInfo(tmpPath);

DimeAttachment dimeAttach = new DimeAttachment("image/gif",
TypeFormat.MediaType, dirInfo.GetFiles()[i].FullName);
ResponseSoapContext.Current.Attachments.Add(dimeAttach);
result=0;
}
catch(Exception exc)
{
result=1;
}
return result;
}


El código del bucle de la función en la parte cliente sería el siguiente:

//numFiles es el número total de subarchivos
//ws es el servicio web
//progBar es una barra de progreso

for(int i=0; i<numFiles; i++)
{
progBar.Value=i+1;
ws.ResponseSoapContext.Attachments.Clear();
if(ws.DownloadChunk(user, ficRemoto, i)==0)
{
//Obtiene el archivo descargado del WebService
Stream stream=ws.ResponseSoapContext.Attachments[0].Stream;

string indice="000" + (i+1).ToString();
string splFile= localFile + "." + indice.Substring(indice.Length-3,3);

FileStream f = System.IO.File.OpenWrite(splFile);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Close();
f.Write(bytes, 0, bytes.Length);
f.Close();
}
else throw new Exception("Error obteniendo el archivo");
}


Un saludo.
Víctor.



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida