using System.Security.Principal;
using Microsoft.Win32.SafeHandles;
using System.Dynamic;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.Metadata;
using System.Text;
using System.Runtime.CompilerServices;
using System.Net.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mime;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using UploadFileToIOPPFTP.Models;
using System.IO;
using System.Net;
using Microsoft.AspNetCore.Authorization;
using System.IO.Compression;
using System.Net.Http.Headers;
using System.Text.Json;
using MovejobtoWms.Helpers;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using RestSharp;
using Newtonsoft.Json.Linq;
using WinSCP;
namespace UploadFileToIOPPFTP.Controllers
{
[Authorize(AuthenticationSchemes = "CustomAuthentication")]
[Route("api/[controller]/{action}")]
[ApiController]
public class UploadFileToIOPPFTPController : ControllerBase
{
HttpClient client = new HttpClient();
private readonly UploadFileToFtpContext _context;
//private IUserService _userService;
private readonly IConfiguration _configuration;
public UploadFileToIOPPFTPController(UploadFileToFtpContext context, IConfiguration configuration)
{
_context = context;
_configuration = configuration;
// _userService = userService;
}
[HttpGet]
public String TestMessage()
{
return "Welcome to IOPPFileUploadIDispatch Api I am Working Fine!";
}
// POST: api/MoveJobtoWms/
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://aka.ms/RazorPagesCRUD.
[HttpPost]
[Consumes(MediaTypeNames.Application.Json)]
[ProducesResponseType(201)]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
[ProducesResponseType(500)]
[ProducesResponseType(401)]
public async Task<IActionResult> UploadFileToFtpBase(RequestBase requestBase)
{
string FtpUploadPath;
List<RequestBase.Stages> Revisesstageids = new List<RequestBase.Stages> { RequestBase.Stages.Revises1, RequestBase.Stages.Revises2, RequestBase.Stages.Revises3, RequestBase.Stages.Revises4, RequestBase.Stages.Firstproof }; //for Revises stages in IOPP
string FitpDetail = string.Empty;
string sError = string.Empty;
var FtpDetails = new FtpDetails();
// bool isFinal = false;
if (requestBase.stageid == (int)RequestBase.Stages.PreEditing || requestBase.stageid == (int)RequestBase.Stages.Copyediting || Revisesstageids.Contains((RequestBase.Stages)requestBase.stageid))
FtpDetails = await _context.FtpDetails.FirstOrDefaultAsync(x => x.FTPName == _configuration["LiveFileUploadPathIOPP"]);
else
FtpDetails = await _context.FtpDetails.FirstOrDefaultAsync(x => x.FTPName == _configuration["FinalFileUploadPathIOPP"]);
if (requestBase.stageid == (int)RequestBase.Stages.PreEditing)
{
FtpUploadPath = _configuration["FtpPreEdited"];
}
else if (Revisesstageids.Contains((RequestBase.Stages)requestBase.stageid))
{
FtpUploadPath = _configuration["FtpProof"];
}
else if (requestBase.stageid == (int)RequestBase.Stages.Copyediting)
{
FtpUploadPath = _configuration["FtpEditedSource"];
}
else
{
//isFinal = true;
FtpUploadPath = _configuration["FtpFinals"];
}
// var fileName = Path.GetFileName(requestBase.Inpath.Replace("/", "\\"));
// var folderName = Path.GetFileNameWithoutExtension(fileName);
//Ftp Upload Path Client
try
{
FtpUploadPath = FtpUploadPath.Replace("bookname", requestBase.BookName).Replace("articleid", requestBase.articleId);
var fileDetail = _context.FileDetails.FirstOrDefault(x => x.fileName == requestBase.articleId);
// var pgcount=new FilePropertyDetail();
// if (FtpUploadPath.ToLower().Contains("proof"))
// {
// pgcount = _context.FilePropertyDetails.FirstOrDefault(x => x.fileId == fileDetail.fileID && x.value2 == requestBase.stageid.ToString() && x.id == 196);
// }
// int pagecnt = 6;
if (UploadFileToFtpClient(requestBase.Inpath, FtpUploadPath, FtpDetails.HostName, FtpDetails.PortNumber, FtpDetails.UserName, FtpDetails.Password, ref sError))
{
if (requestBase.stageid == (int)RequestBase.Stages.PreEditing && requestBase.WmsId == (int)RequestBase.Wmsids.IOPP)
{
if (CallAPI(requestBase.url, requestBase.journalAcronym, requestBase.articleId, requestBase.taskName, requestBase.urlType, ref sError))
{
return StatusCode(200, new { is_success = true, data = "", message = "Success" });
}
else
{
return StatusCode(200, new { is_success = false, data = "", message = sError });
}
}
else
{
return StatusCode(200, new { is_success = true, data = "", message = sError });
}
//return StatusCode(200, new { is_success = true, data = "", message = "Success" });
}
else
{
return StatusCode(200, new { is_success = false, data = "", message = sError });
}
}
catch (Exception ex)
{
return StatusCode(500, new { is_success = false, data = "", message = ex.Message.ToString() });
}
}
[NonAction]
public bool CallAPI(string Url, string journalAcronym, string articleId, string taskName, string urlType, ref string s_Error)
{
var responseDetail = new ProtanResponse
{
url = Url,
journalAcronym = journalAcronym,
articleId = articleId,
taskName = taskName,
urlType = urlType
};
string Token = _configuration["ProtanApiToken"];
string Username = _configuration["ProtanApiUsrName"];
string Password = _configuration["ProtanApiPassword"];
var client = new RestClient(_configuration["ProtanApiUri"]);
var request = new RestRequest(Method.POST);
request.AddHeader("iauthor-token", Token);
request.AddHeader("authorization", GetAuthorization(Username, Password));
request.AddHeader("content-type", "application/json");
// String.Format("{\"url\":\"{0}\",\"journalAcronym\":\"{1}\",\"articleId\":\"{2}\",\"taskName\":\"{3}\",\"urlType\":\"{4}\"}", Url, journalAcronym, articleId, taskName, urlType)
request.AddParameter("application/json", JsonConvert.SerializeObject(responseDetail), ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
var ProtanResponse = JObject.Parse(response.Content);
if (ProtanResponse.GetValue("status").ToString() == "success")
return true;
else
s_Error = ProtanResponse.GetValue("status").ToString();
return false;
}
[NonAction]
private string GetAuthorization(string Username, string Password)
{
String authString = Username + ":" + Password;
return "Basic " + Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(authString)).ToString();
}
[NonAction]
private static bool UploadFileToFtpClient(List<string> Filespath, string outpath, string _address, int _port, string _username, string _password, ref string sError)
{
bool isfileuploadSuccess = false;
bool isfileExist = false;
string constructedPath = "/";
string[] remoteDir = null;
Session session = null;
try
{
foreach (var Filepath in Filespath)
{
// if (outpath.Contains("Proof"))
// {
// outpath = Path.GetDirectoryName(outpath).Replace("\\", "/") + "/" + Path.GetFileNameWithoutExtension(Filepath) + "p" + pgcount + Path.GetExtension(Filepath); //for Firstproof Stage alone
// }
// else
// {
outpath = Path.GetDirectoryName(outpath).Replace("\\", "/") + "/" + Path.GetFileName(Filepath);
//}
if (_port == 22)
{
session = new Session();
SessionOptions sessionOptions = new SessionOptions();
sessionOptions.Protocol = Protocol.Sftp;
sessionOptions.HostName = _address;
sessionOptions.UserName = _username;
sessionOptions.Password = _password;
//
sessionOptions.SshHostKeyFingerprint = session.ScanFingerprint(sessionOptions, "SHA-256");
session.Open(sessionOptions);
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
TransferOperationResult transferResult;
//This is for Getting/Downloading files from SFTP
// transferResult = session.GetFiles( "", destinationFtpUrl, false, transferOptions);
//This is for Putting/Uploading file on SFTP
// if (session.FileExists(outpath))
// {
// }
// else
// {
// session.CreateDirectory(Path.GetDirectoryName(outpath).Replace("\\", "/"));
// }
remoteDir = Path.GetDirectoryName(outpath).Replace("\\", "/").Split('/');
//creating Folders in Remote Path
for (int i = 0; i < remoteDir.Length; i++)
{
constructedPath = constructedPath + "/" + remoteDir[i];
isfileExist = session.FileExists(constructedPath);
if (!isfileExist)
session.CreateDirectory(constructedPath);
}
transferResult = session.PutFiles(Filepath.Replace("/", @"\"), outpath, false, transferOptions);
if (transferResult.IsSuccess)
{
isfileuploadSuccess = true;
}
else
{
sError = transferResult.Failures[0].ToString();
isfileuploadSuccess = false;
}
}
else
{
//Session session = new Session();
session = new Session();
SessionOptions sessionOptions = new SessionOptions();
sessionOptions.Protocol = Protocol.Ftp;
sessionOptions.HostName = _address;
sessionOptions.UserName = _username;
sessionOptions.Password = _password;
//
// sessionOptions.SshHostKeyFingerprint = session.ScanFingerprint(sessionOptions, "SHA-256");
session.Open(sessionOptions);
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
TransferOperationResult transferResult;
//This is for Getting/Downloading files from SFTP
// transferResult = session.GetFiles( "", destinationFtpUrl, false, transferOptions);
//This is for Putting/Uploading file on SFTP
// if (!session.FileExists(outpath))
// {
// }
// else
// {
// session.CreateDirectory(Path.GetDirectoryName(outpath).Replace("\\", "/"));
// }
for (int i = 0; i < remoteDir.Length; i++)
{
constructedPath = constructedPath + "/" + remoteDir[i];
isfileExist = session.FileExists(constructedPath);
if (!isfileExist)
session.CreateDirectory(constructedPath);
}
transferResult = session.PutFiles(Filepath.Replace("/", "\\"), outpath, false, transferOptions);
if (transferResult.IsSuccess)
{
isfileuploadSuccess = true;
}
else
{
sError = transferResult.Failures[0].ToString();
isfileuploadSuccess = false;
}
// outpath = Path.GetDirectoryName(outpath).Replace("\\", "/") + "/" + Path.GetFileName(Filepath);
// var to_uri = "ftp://" + _address + outpath;
// //to Create Directory if not Exist
// var remoteDirExist = FtpDirectoryExists("ftp://" + _address + Path.GetDirectoryName(outpath).Replace("\\", "/"), _username, _password, ref sError);
// if (!remoteDirExist)
// {
// FtpWebRequest Dirrequest = (FtpWebRequest)WebRequest.Create("ftp://" + _address + Path.GetDirectoryName(outpath).Replace("\\", "/"));
// Dirrequest.Credentials = new NetworkCredential(_username, _password);
// Dirrequest.Method = WebRequestMethods.Ftp.MakeDirectory;
// Dirrequest.UsePassive = false;
// Dirrequest.Proxy = null;
// FtpWebResponse response = (FtpWebResponse)Dirrequest.GetResponse();
// }
// // if (remoteDirExist)
// // {
// //
// FtpWebRequest request = (FtpWebRequest)WebRequest.Create(to_uri);
// request.Method = WebRequestMethods.Ftp.UploadFile;
// request.UsePassive = true;
// request.Proxy = null;
// // Get network credentials.
// request.Credentials = new NetworkCredential(_username, _password);
// // Read the file's contents into a byte array.
// byte[] bytes = System.IO.File.ReadAllBytes(Filepath);
// // Write the bytes into the request stream.
// request.ContentLength = bytes.Length;
// using (Stream request_stream = request.GetRequestStream())
// {
// request_stream.Write(bytes, 0, bytes.Length);
// request_stream.Close();
// }
}
}
}
catch (Exception ex)
{
sError = ex.Message.ToString();
return false;
}
return isfileuploadSuccess;
}
[NonAction]
private static bool FtpDirectoryExists(string directoryPath, string ftpUser, string ftpPassword, ref string SException)
{
bool IsExists = true;
try
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(directoryPath);
request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
request.UsePassive = true;
request.Proxy = null;
request.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
}
catch (Exception ex)
{
SException = ex.Message.ToString();
IsExists = false;
}
return IsExists;
}
}
}
Comments
Post a Comment