Hello !
J'utilise actuellement ASP.net pour réaliser une petite appli de gestion de documents.
Je cherche à réaliser un joli uploader de fichier du client directement vers un serveur FTP.
Jusque là, j'ai réussi à tout faire fonctionner : le document est bien envoyé par le client et traité coté serveur pour être envoyé sur le serveur FTP.
Mais (forcément, il y a un mais ^^), je constate qu'une fois le formulaire posté, le navigateur du client reste bloqué le temps que l'intégralité du fichier soit envoyé !
J'utilise un plugin jQuery pour accéder au système de fichier et présenter une barre de progression lors de l'upload (excellent plugin nommé uploadify).
Comme dit plus haut, tout fonctionne mais le client vois sa barre de chargement à 100% une fois que l'intégralité du fichier est transferé ; mais à ce moment là, le fichier n'a même pas commencé son envoi au serveur FTP.
Mon objectif est donc de trouver une solution permettant (en gros) de faire un streaming du client vers le serveur.
Ai-je fais une erreur ?
Est-ce completement normal ?
Merci de m'avoir lu :)
Voici le code qui gère la réception du fichier puis son envoi au serveur FTP.
Je constate clairement le problème si je pose un breakpoint en première ligne : il semble que je ne puisse pas accéder à "context.Request.Files["Filedata"].FileName" si le fichier n'as pas été intégralement envoyé par le client (d'ou la lenteur !).
public partial class upload : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
try
{
//HttpPostedFile file = context.Request.Files["Filedata"];
string serverPath = "ftp://10.0.0.10/" + context.Request.Files["Filedata"].FileName;
FtpWebRequest requestObj = FtpWebRequest.Create(serverPath) as FtpWebRequest;
requestObj.Method = WebRequestMethods.Ftp.UploadFile;
requestObj.Credentials = new NetworkCredential("login", "password");
Stream outputStream = requestObj.GetRequestStream();
// UPLOAD VERS LE FTP...
CopyStream(context.Request.Files["Filedata"].InputStream, outputStream);
context.Request.Files["file"].InputStream.Close();
outputStream.Flush();
outputStream.Close();
requestObj = null;
context.Response.Write("1");
}
catch (Exception x) {
};
}
public bool IsReusable
{
get { return false; }
}
private static string CopyStream(Stream inStream, Stream outStream)
{
try
{
byte[] buffer = new byte[1024];
for (; ; )
{
int numBytesRead = inStream.Read(buffer, 0, buffer.Length);
if (numBytesRead <= 0)
break;
outStream.Write(buffer, 0, numBytesRead);
}
inStream.Close();
return "success";
}
catch (System.Exception ee)
{
return ee.Message;
}
}
}