3 using System.Collections.Generic;
7 using System.Security.Cryptography.X509Certificates;
15 internal class OfflineUpAndDownFTP_Impl : IOfflineUpAndDown
29 _oFtpUserData = CargarConfiguracion();
32 private int _nIdConf = 0;
34 private FtpUserData _oFtpUserData = null;
36 #endregion Propiedades 44 public OfflineUpAndDownFTP_Impl()
53 public OfflineUpAndDownFTP_Impl(FtpUserData config) : this()
55 _oFtpUserData = config;
58 #endregion Constructores 61 #region Métodos públicos 72 public bool Comprobar_Conexion(FtpUserData toFtpUserData,
bool lbAsistConfSig)
74 string lcRemoteUri = toFtpUserData.ToRemoteUri();
78 FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(lcRemoteUri);
79 if (!
string.IsNullOrWhiteSpace(toFtpUserData.proxy))
81 WebProxy proxyObject =
new WebProxy(toFtpUserData.proxy,
true);
82 ftpRequest.Proxy = proxyObject;
84 ftpRequest.UsePassive = !toFtpUserData.ftp_activo;
85 ftpRequest.EnableSsl = toFtpUserData.use_ssl_tls;
86 if (toFtpUserData.use_ssl_tls && !toFtpUserData.validate_server_cert)
88 ServicePointManager.ServerCertificateValidationCallback =
89 (sender, certificate, chain, errors) =>
95 ftpRequest.Timeout = 10000;
96 ftpRequest.Credentials =
new NetworkCredential(toFtpUserData.user, toFtpUserData.password);
97 ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
98 FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
99 StreamReader streamReader =
new StreamReader(response.GetResponseStream());
101 string lcCarpetaFtp = streamReader.ReadLine();
104 streamReader.Close();
106 catch (Exception loEx)
110 toFtpUserData.error_message =
"Se ha producido un error al obtener datos del FTP (" + loEx.Message +
").";
114 toFtpUserData.error_message =
"Para avanzar al siguiente paso debe definir una configuración de conexión. Configure Servidor FTP o OneDrive para poder continuar.";
121 ServicePointManager.ServerCertificateValidationCallback = null;
137 public bool Descargar_Fichero(
string path,
string fileName,
string carpeta,
int idConf,
bool deleteSource)
140 _oFtpUserData.carpetaserv = carpeta;
142 string lcRemoteUri = _oFtpUserData.ToRemoteUri();
145 FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(lcRemoteUri);
146 if (!
string.IsNullOrWhiteSpace(_oFtpUserData.proxy))
148 WebProxy proxyObject =
new WebProxy(_oFtpUserData.proxy,
true);
149 ftpRequest.Proxy = proxyObject;
151 ftpRequest.UsePassive = !_oFtpUserData.ftp_activo;
152 ftpRequest.EnableSsl = _oFtpUserData.use_ssl_tls;
153 if (_oFtpUserData.use_ssl_tls && !_oFtpUserData.validate_server_cert)
155 ServicePointManager.ServerCertificateValidationCallback =
156 (sender, certificate, chain, errors) =>
162 ftpRequest.Timeout = 10000;
163 ftpRequest.Credentials =
new NetworkCredential(_oFtpUserData.user, _oFtpUserData.password);
164 ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
165 FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
166 StreamReader streamReader =
new StreamReader(response.GetResponseStream());
168 string lcCarpetaFtp = streamReader.ReadLine();
169 while (!
string.IsNullOrEmpty(lcCarpetaFtp))
171 if (!lcCarpetaFtp.StartsWith(
"/"))
172 lcCarpetaFtp =
"/" + lcCarpetaFtp;
174 if (!lcCarpetaFtp.EndsWith(
"/"))
175 lcCarpetaFtp = lcCarpetaFtp +
"/";
177 if (!_oFtpUserData.rutaserv.StartsWith(
"/"))
178 _oFtpUserData.rutaserv =
"/" + _oFtpUserData.rutaserv;
180 if (!_oFtpUserData.rutaserv.EndsWith(
"/"))
181 _oFtpUserData.rutaserv = _oFtpUserData.rutaserv +
"/";
183 if (lcCarpetaFtp.ToUpper() == _oFtpUserData.rutaserv.ToUpper())
185 string fullFileName = Path.Combine(path, fileName);
186 if (Directory.Exists(path))
188 if (File.Exists(fullFileName))
189 File.Delete(fullFileName);
193 Directory.CreateDirectory(path);
196 DescargarArchivoFTP(fileName, path,
true, deleteSource);
200 lcCarpetaFtp = streamReader.ReadLine();
203 streamReader.Close();
205 catch (Exception loEx)
207 string error =
"Se ha producido un error al obtener datos del FTP (" + loEx.Message +
").";
213 ServicePointManager.ServerCertificateValidationCallback = null;
220 public List<string> GetListFiles(
string carpetaserv,
int idConf)
222 List<string> lsFicheros =
new List<string>();
225 if(!
string.IsNullOrWhiteSpace(carpetaserv))
226 _oFtpUserData.carpetaserv = carpetaserv +
"/";
228 return GetListFiles(_oFtpUserData);
236 public List<string> GetListFiles(FtpUserData configFtp)
238 List<string> lsFicheros =
new List<string>();
241 string lcRemoteUri = configFtp.ToRemoteUri();
243 lcRemoteUri = lcRemoteUri +
"//" + configFtp.rutaserv +
"//" + configFtp.carpetaserv;
247 FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(lcRemoteUri);
248 if (!
string.IsNullOrWhiteSpace(configFtp.proxy))
250 WebProxy proxyObject =
new WebProxy(configFtp.proxy,
true);
251 ftpRequest.Proxy = proxyObject;
253 ftpRequest.UsePassive = !configFtp.ftp_activo;
254 ftpRequest.EnableSsl = configFtp.use_ssl_tls;
255 if (configFtp.use_ssl_tls && !configFtp.validate_server_cert)
257 ServicePointManager.ServerCertificateValidationCallback =
258 (sender, certificate, chain, errors) =>
264 ftpRequest.Timeout = 10000;
265 ftpRequest.Credentials =
new NetworkCredential(configFtp.user, configFtp.password);
266 ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
267 FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
268 StreamReader streamReader =
new StreamReader(response.GetResponseStream());
270 string lcFichero = streamReader.ReadLine();
271 while (!
string.IsNullOrEmpty(lcFichero))
273 lsFicheros.Add(lcFichero);
275 lcFichero = streamReader.ReadLine();
278 streamReader.Close();
282 return new List<string>();
286 ServicePointManager.ServerCertificateValidationCallback = null;
301 public bool Subir_Fichero(
string archivo,
string zipFilename,
string carpeta,
int idConf, ref
long uploadedFileSize)
306 _oFtpUserData.carpetaserv = carpeta;
308 if (!CargarArchivoFTP(archivo, zipFilename, ref uploadedFileSize))
310 string error =
"No se han podido subir el fichero " + archivo +
" al FTP.";
315 catch (Exception loEx)
317 string error =
"Se ha producido un error al subir datos al FTP (" + loEx.Message +
").";
319 DB.Registrar_Error(loEx);
327 #endregion Métodos públicos 330 #region Métodos privados 337 private FtpUserData CargarConfiguracion()
340 Dictionary<string, object> tablaMultconf = DB.SQLREGValor(
"MULTCONF",
"IDCONF", _idConf.ToString(),
"OFFLINE");
342 string cadenaEncriptada = tablaMultconf[
"cfg_ftp"].ToString().Trim();
344 var toolsOffline =
new clsOffLine();
345 string cadenaDesencriptada = toolsOffline.Cadena_Desencriptar(cadenaEncriptada);
347 var trozos = cadenaDesencriptada.Split(
'~');
349 if (trozos.Length == 7)
351 var ftp_user_data =
new FtpUserData
353 server = trozos[0].Trim(),
354 user = trozos[1].Trim(),
355 password = trozos[2].Trim(),
356 port = Convert.ToDecimal(trozos[3]),
357 proxy = trozos[4].Trim(),
358 rutaserv = trozos[5].Trim(),
359 ftp_activo = trozos[6].Trim().ToUpper() ==
"SI" 361 return ftp_user_data;
363 else if (trozos.Length == 9)
365 var ftp_user_data =
new FtpUserData
367 server = trozos[0].Trim(),
368 user = trozos[1].Trim(),
369 password = trozos[2].Trim(),
370 port = Convert.ToDecimal(trozos[3]),
371 proxy = trozos[4].Trim(),
372 rutaserv = trozos[5].Trim(),
373 ftp_activo = trozos[6].Trim().ToUpper() ==
"SI",
374 use_ssl_tls = trozos[7].Trim().ToUpper() ==
"SI",
375 validate_server_cert = trozos[8].Trim().ToUpper() ==
"SI",
377 return ftp_user_data;
380 throw new NotSupportedException(
"Error cargando configuración FTP");
387 private void MakeFTPDir(FtpUserData ftpUserData)
389 FtpWebRequest ftpRequest = null;
390 Stream ftpStream = null;
391 string pathToCreate = ftpUserData.rutaserv +
"//" + ftpUserData.carpetaserv;
392 string[] subDirs = pathToCreate.Split(
'/');
393 string currentDir = ftpUserData.ToRemoteUri();
394 bool llExist =
false;
396 foreach (
string subDir
in subDirs)
398 if (!
string.IsNullOrWhiteSpace(subDir))
403 ftpRequest = (FtpWebRequest)FtpWebRequest.Create(currentDir);
404 if (!
string.IsNullOrWhiteSpace(ftpUserData.proxy))
406 WebProxy proxyObject =
new WebProxy(ftpUserData.proxy,
true);
407 ftpRequest.Proxy = proxyObject;
409 ftpRequest.UsePassive = !ftpUserData.ftp_activo;
410 ftpRequest.EnableSsl = ftpUserData.use_ssl_tls;
411 if (ftpUserData.use_ssl_tls && !ftpUserData.validate_server_cert)
413 ServicePointManager.ServerCertificateValidationCallback =
414 (sender, certificate, chain, errors) =>
420 ftpRequest.Timeout = 10000;
421 ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
422 ftpRequest.Credentials =
new NetworkCredential(ftpUserData.user, ftpUserData.password);
424 FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
425 StreamReader streamReader =
new StreamReader(response.GetResponseStream());
427 string lcFolder = streamReader.ReadLine();
428 while (!
string.IsNullOrEmpty(lcFolder))
430 if (lcFolder.Contains(
"/"))
432 lcFolder = lcFolder.Substring(lcFolder.LastIndexOf(
"/") + 1);
436 if (lcFolder.ToUpper() == subDir.ToUpper())
441 lcFolder = streamReader.ReadLine();
444 streamReader.Close();
447 currentDir = currentDir +
"//" + subDir;
451 ftpRequest = (FtpWebRequest)FtpWebRequest.Create(currentDir);
452 if (!
string.IsNullOrWhiteSpace(ftpUserData.proxy))
454 WebProxy proxyObject =
new WebProxy(ftpUserData.proxy,
true);
455 ftpRequest.Proxy = proxyObject;
457 ftpRequest.UsePassive = !ftpUserData.ftp_activo;
458 ftpRequest.EnableSsl = ftpUserData.use_ssl_tls;
459 if (ftpUserData.use_ssl_tls && !ftpUserData.validate_server_cert)
461 ServicePointManager.ServerCertificateValidationCallback =
462 (sender, certificate, chain, errors) =>
468 ftpRequest.Timeout = 10000;
469 ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
470 ftpRequest.UseBinary =
true;
471 ftpRequest.Credentials =
new NetworkCredential(ftpUserData.user, ftpUserData.password);
473 response = (FtpWebResponse)ftpRequest.GetResponse();
474 ftpStream = response.GetResponseStream();
485 ServicePointManager.ServerCertificateValidationCallback = null;
498 private bool CargarArchivoFTP(
string fileNameWithPath,
string fileNameZip, ref
long uploadedFileSize)
500 string lcRemoteUri = _oFtpUserData.ToRemoteUri();
506 MakeFTPDir(_oFtpUserData);
508 if (!
string.IsNullOrWhiteSpace(fileNameZip) && File.Exists(fileNameWithPath))
510 clsOffLine utilsOffline =
new clsOffLine();
511 string pathArchivoComprimido = utilsOffline.Fichero_Comprimir(fileNameWithPath, fileNameZip);
513 fileNameWithPath = Path.Combine(Path.GetDirectoryName(fileNameWithPath), pathArchivoComprimido);
514 fileNameWithPath = Path.Combine(fileNameWithPath, fileNameZip);
519 string lcFileFtp = lcRemoteUri + _oFtpUserData.rutaserv +
"/" + _oFtpUserData.carpetaserv +
System.IO.Path.GetFileName(fileNameWithPath);
521 FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(lcFileFtp);
522 if (!
string.IsNullOrWhiteSpace(_oFtpUserData.proxy))
524 WebProxy proxyObject =
new WebProxy(_oFtpUserData.proxy,
true);
525 ftpRequest.Proxy = proxyObject;
527 ftpRequest.UsePassive = !_oFtpUserData.ftp_activo;
528 ftpRequest.EnableSsl = _oFtpUserData.use_ssl_tls;
529 if (_oFtpUserData.use_ssl_tls && !_oFtpUserData.validate_server_cert)
531 ServicePointManager.ServerCertificateValidationCallback =
532 (sender, certificate, chain, errors) =>
538 ftpRequest.Timeout = 10000;
539 ftpRequest.Credentials =
new NetworkCredential(_oFtpUserData.user, _oFtpUserData.password);
540 ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
543 using (Stream fileStream = File.OpenRead(fileNameWithPath))
545 using (Stream ftpStream = ftpRequest.GetRequestStream())
547 fileStream.CopyTo(ftpStream);
551 uploadedFileSize =
new FileInfo(fileNameWithPath).Length;
559 ServicePointManager.ServerCertificateValidationCallback = null;
574 private bool DescargarArchivoFTP(
string archivo,
string carpetaLocal,
bool uncompressZip,
bool deleteSource)
576 return DescargarArchivoFTP(_oFtpUserData, archivo, carpetaLocal, uncompressZip, deleteSource);
590 public bool DescargarArchivoFTP(FtpUserData datosFtp,
string archivo,
string carpetaLocal,
bool uncompressZip,
bool deleteSource)
592 string lcRemoteUri = datosFtp.ToRemoteUri();
594 string lcDirTemp = carpetaLocal;
595 string lcFileName = Path.Combine(lcDirTemp, archivo);
597 string lcFileFtp = null;
602 lcFileFtp = lcRemoteUri +
"//" + datosFtp.rutaserv +
"//" + datosFtp.carpetaserv +
"//" + archivo;
604 FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(lcFileFtp);
605 if (!
string.IsNullOrWhiteSpace(datosFtp.proxy))
607 WebProxy proxyObject =
new WebProxy(datosFtp.proxy,
true);
608 ftpRequest.Proxy = proxyObject;
610 ftpRequest.UsePassive = !datosFtp.ftp_activo;
611 ftpRequest.EnableSsl = datosFtp.use_ssl_tls;
612 if (datosFtp.use_ssl_tls && !datosFtp.validate_server_cert)
614 ServicePointManager.ServerCertificateValidationCallback =
615 (sender, certificate, chain, errors) =>
621 ftpRequest.Timeout = 10000;
622 ftpRequest.Credentials =
new NetworkCredential(datosFtp.user, datosFtp.password);
623 ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
626 using (Stream ftpStream = ftpRequest.GetResponse().GetResponseStream())
628 using (Stream fileStream = File.Create(lcFileName))
630 ftpStream.CopyTo(fileStream);
634 if (uncompressZip && File.Exists(lcFileName))
636 clsOffLine utilsOffline =
new clsOffLine();
637 utilsOffline.Fichero_Descomprimir(lcFileName, Path.GetDirectoryName(lcFileName),
false);
642 ftpRequest = (FtpWebRequest)WebRequest.Create(lcFileFtp);
644 if (!
string.IsNullOrWhiteSpace(datosFtp.proxy))
646 WebProxy proxyObject =
new WebProxy(datosFtp.proxy,
true);
647 ftpRequest.Proxy = proxyObject;
649 ftpRequest.UsePassive = !datosFtp.ftp_activo;
650 ftpRequest.EnableSsl = datosFtp.use_ssl_tls;
651 if (datosFtp.use_ssl_tls && !datosFtp.validate_server_cert)
653 ServicePointManager.ServerCertificateValidationCallback =
654 (sender, certificate, chain, errors) =>
660 ftpRequest.Timeout = 10000;
661 ftpRequest.Credentials =
new NetworkCredential(datosFtp.user, datosFtp.password);
662 ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
664 FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
674 ServicePointManager.ServerCertificateValidationCallback = null;
680 private bool _LocalCertificateValidationCallback(
object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
684 #endregion Métodos privados
Es como el tipo de entrada asientos pero por negocio, sin formulario, pq quiero que me haga las propu...