You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
326 lines
46 KiB
326 lines
46 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Configuration;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Web.Http;
|
|
using DOCGEN;
|
|
using Model;
|
|
using Database;
|
|
using Newtonsoft.Json;
|
|
using System.IO;
|
|
using System.Net.Http.Headers;
|
|
using System.Drawing;
|
|
using System.Threading.Tasks;
|
|
using System.Threading;
|
|
using API_NetFramework.Models;
|
|
using System.Web.Http.Controllers;
|
|
using SecuringWebApiUsingApiKey.Middleware;
|
|
using System.Drawing.Drawing2D;
|
|
|
|
|
|
|
|
|
|
|
|
namespace API_NetFramework.Controllers
|
|
{
|
|
public interface IFileService
|
|
{
|
|
Stream GetImageAsStream();
|
|
byte[] GetImageAsByteArray();
|
|
}
|
|
|
|
public static class Image
|
|
{
|
|
public const string Base64Image = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAFIArsDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9UKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo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gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//9k=";
|
|
|
|
}
|
|
|
|
|
|
|
|
public class UnterschriftController : ApiController
|
|
{
|
|
string tokenfunction = "Unterschrift";
|
|
string connectionstring = StringCipher.Decrypt(ConfigurationManager.ConnectionStrings["EDOKAConnectionstring"].ConnectionString, "i%!k!7pab%bNLdA5hE4pkR4XaB%E^jB3d9tHuQ4pbF&BZjF7SB#WBWit5#HrbJiLrLVm");
|
|
private System.Drawing.Image ResizeImage(System.Drawing.Image imgToResize, Size size)
|
|
{
|
|
// Get the image current width
|
|
int sourceWidth = imgToResize.Width;
|
|
// Get the image current height
|
|
int sourceHeight = imgToResize.Height;
|
|
float nPercent = 0;
|
|
float nPercentW = 0;
|
|
float nPercentH = 0;
|
|
// Calculate width and height with new desired size
|
|
nPercentW = ((float)size.Width / (float)sourceWidth);
|
|
nPercentH = ((float)size.Height / (float)sourceHeight);
|
|
nPercent = Math.Min(nPercentW, nPercentH);
|
|
// New Width and Height
|
|
int destWidth = (int)(sourceWidth * nPercent);
|
|
int destHeight = (int)(sourceHeight * nPercent);
|
|
Bitmap b = new Bitmap(destWidth, destHeight);
|
|
Graphics g = Graphics.FromImage((System.Drawing.Image)b);
|
|
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
|
// Draw image with new width and height
|
|
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
|
|
g.Dispose();
|
|
return (System.Drawing.Image)b;
|
|
}
|
|
private System.Drawing.Image resizeImage(System.Drawing.Image imgToResize, Size size)
|
|
{
|
|
return (System.Drawing.Image)(new Bitmap(imgToResize, size));
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="TGNummer">Required. </param>
|
|
/// <param name="ImageWidth">Optional. The default value is 0.</param>
|
|
/// <param name="ImageHeight">Optional. The default value is 0.</param>
|
|
/// <returns>Unterschriften-Image für die gelieferte TGNummer als Base64</returns>
|
|
/// <remarks>Parameter ImageWidth<br></br>
|
|
/// 0: Verwendung der Standardgrösse 140x70<br></br>
|
|
/// -1: Verwendung der Originalgrösse<br></br>
|
|
/// Anderer Wert Grössenänderung ImageWidth / ImageHeight
|
|
/// </remarks>
|
|
[HttpGet]
|
|
[Route("API/GetUnterschriftAsBase64")]
|
|
public IHttpActionResult GetUnterschriftAsBase64(string TGNummer, int ImageWidth = 0, int ImageHeight = 0)
|
|
{
|
|
if (SecuringWebApiUsingApiKey.Middleware.ApiKeyMiddleware.Authorized((HttpRequestMessage)Request, tokenfunction) == false)
|
|
{
|
|
return Content(HttpStatusCode.Unauthorized, "Invalid Token or API-Key");
|
|
}
|
|
try
|
|
{
|
|
|
|
APILogging.Log((HttpRequestMessage)Request, "Start GetUnterschriftAsBase64 TGNummer: " + TGNummer, LogLevelType.Debug);
|
|
string path = System.Configuration.ConfigurationManager.AppSettings["UnterschriftPath"];
|
|
string filename = "";
|
|
if (System.Configuration.ConfigurationManager.AppSettings["DemoUnterschrift"] == "YES")
|
|
{
|
|
filename = path + "1.jpg";
|
|
}
|
|
else { filename = path + TGNummer + ".jpg"; }
|
|
if (!File.Exists(filename))
|
|
{
|
|
APILogging.Log((HttpRequestMessage)Request, "Unterschrift-Bezug - nicht vorhanden: " + TGNummer, LogLevelType.Info);
|
|
return Content(HttpStatusCode.NotFound, "Image " + filename + " not found");
|
|
}
|
|
try
|
|
{
|
|
APILogging.Log((HttpRequestMessage)Request, "Unterschrift-Bezug: " + TGNummer, LogLevelType.Info);
|
|
System.Drawing.Image iimg = System.Drawing.Image.FromFile(filename);
|
|
System.Drawing.Image imgnew = null;
|
|
switch (ImageWidth)
|
|
{
|
|
case 0:
|
|
ImageWidth = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["DefaultImageWidth"]);
|
|
ImageHeight = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["DefaultImageHeight"]);
|
|
Bitmap b = new Bitmap(iimg);
|
|
imgnew = ResizeImage(b, new Size(ImageHeight, ImageWidth));
|
|
b = null;
|
|
break;
|
|
case -1:
|
|
imgnew = iimg;
|
|
break;
|
|
default:
|
|
Bitmap b1 = new Bitmap(iimg);
|
|
imgnew = ResizeImage(b1, new Size(ImageHeight, ImageWidth));
|
|
b1 = null;
|
|
break;
|
|
|
|
}
|
|
using (MemoryStream m = new MemoryStream())
|
|
{
|
|
string newfilename = path + Guid.NewGuid().ToString() + ".jpg";
|
|
imgnew.Save(newfilename);
|
|
imgnew = System.Drawing.Image.FromFile(newfilename);
|
|
imgnew.Save(m, imgnew.RawFormat);
|
|
byte[] imageBytes = m.ToArray();
|
|
imgnew.Dispose();
|
|
m.Dispose();
|
|
System.IO.File.Delete(newfilename);
|
|
return Ok(Convert.ToBase64String(imageBytes));
|
|
}
|
|
|
|
|
|
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
APILogging.Log((HttpRequestMessage)Request, e.Message, LogLevelType.Error);
|
|
return Content(HttpStatusCode.InternalServerError, e.Message);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
APILogging.Log((HttpRequestMessage)Request, e.Message, LogLevelType.Error);
|
|
return Content(HttpStatusCode.InternalServerError, e.Message);
|
|
}
|
|
|
|
}
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="MaNr">Required. </param>
|
|
/// <param name="ImageWidth">Optional. The default value is 0.</param>
|
|
/// <param name="ImageHeight">Optional. The default value is 0.</param>
|
|
/// <returns>Unterschriften-Image für die gelieferte Mitarbeiternr als Base64</returns>
|
|
/// <remarks>Parameter ImageWidth<br></br>
|
|
/// 0: Verwendung der Standardgrösse 140x70<br></br>
|
|
/// -1: Verwendung der Originalgrösse<br></br>
|
|
/// Anderer Wert Grössenänderung ImageWidth / ImageHeight
|
|
/// </remarks>
|
|
[HttpGet]
|
|
[Route("API/GetUnterschriftAsBase64ByMitarbeiternr")]
|
|
public IHttpActionResult GetUnterschriftAsBase64ByMitarbeiternr(string MaNr, int ImageWith = 0, int ImageHeight=0)
|
|
{
|
|
if (SecuringWebApiUsingApiKey.Middleware.ApiKeyMiddleware.Authorized((HttpRequestMessage)Request, tokenfunction) == false)
|
|
{
|
|
return Content(HttpStatusCode.Unauthorized, "Invalid Token or API-Key");
|
|
}
|
|
try
|
|
{
|
|
DB dB = new DB(connectionstring);
|
|
dB.Get_Tabledata("Select TGNummer from mitarbeiter where mitarbeiternr = " + MaNr, false, true);
|
|
string nr = "";
|
|
try
|
|
{
|
|
nr = dB.dsdaten.Tables[0].Rows[0][0].ToString();
|
|
}
|
|
catch
|
|
{
|
|
APILogging.Log((HttpRequestMessage)Request, "TGNummer für Mitarbeiter nicht vorhanden Mitarbeiternr: " + MaNr, LogLevelType.Debug);
|
|
return Content(HttpStatusCode.NotFound, "Mitarbeiternr: "+ MaNr+ " not found");
|
|
}
|
|
dB = null;
|
|
return GetUnterschriftAsBase64(nr,ImageWith,ImageHeight);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
APILogging.Log((HttpRequestMessage)Request, e.Message, LogLevelType.Error);
|
|
return Content(HttpStatusCode.InternalServerError, e.Message);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//[HttpGet]
|
|
//[Route("API/GetUnterschrift")]
|
|
//public IHttpActionResult GetUnterschrift(string TGNummer)
|
|
//{
|
|
// if (SecuringWebApiUsingApiKey.Middleware.ApiKeyMiddleware.Authorized((HttpRequestMessage)Request, tokenfunction) == false)
|
|
// {
|
|
// return Content(HttpStatusCode.Unauthorized, "Invalid Token or API-Key");
|
|
// }
|
|
// try
|
|
// {
|
|
// APILogging.Log((HttpRequestMessage)Request, "Start GetUnterschrift TGNummer: " + TGNummer, LogLevelType.Debug);
|
|
// string path = System.Configuration.ConfigurationManager.AppSettings["UnterschriftPath"];
|
|
// string filename = path + TGNummer + ".jpg";
|
|
// if (!File.Exists(filename))
|
|
// {
|
|
// return Content(HttpStatusCode.NotFound, "Image " + filename + " not found");
|
|
// }
|
|
// try
|
|
// {
|
|
|
|
// byte[] b = File.ReadAllBytes(filename);
|
|
// var dataStream = new MemoryStream(b);
|
|
// string imageName = TGNummer + ".jpg";
|
|
// APILogging.Log((HttpRequestMessage)Request, "Ende GetUnterschrift TGNummer: " + TGNummer, LogLevelType.Debug);
|
|
|
|
// return new unterschriftResult(dataStream, Request, imageName);
|
|
// }
|
|
// catch (Exception e)
|
|
// {
|
|
// APILogging.Log((HttpRequestMessage)Request, e.Message, LogLevelType.Error);
|
|
// return Content(HttpStatusCode.InternalServerError, e.Message);
|
|
// }
|
|
// }
|
|
// catch (Exception e)
|
|
// {
|
|
// APILogging.Log((HttpRequestMessage)Request, e.Message, LogLevelType.Error);
|
|
// return Content(HttpStatusCode.InternalServerError, e.Message);
|
|
// }
|
|
|
|
//}
|
|
|
|
}
|
|
public class FileResult : IHttpActionResult
|
|
{
|
|
private readonly string filePath;
|
|
private readonly string contentType;
|
|
|
|
public FileResult(string filePath, string contentType = null)
|
|
{
|
|
this.filePath = filePath;
|
|
this.contentType = contentType;
|
|
}
|
|
|
|
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
|
|
{
|
|
return Task.Run(() =>
|
|
{
|
|
var response = new HttpResponseMessage(HttpStatusCode.OK)
|
|
{
|
|
Content = new StreamContent(File.OpenRead(filePath))
|
|
};
|
|
|
|
|
|
var contentType = "image/jpeq";
|
|
//this.contentType ?? MimeMapping.GetMimeMapping(Path.GetExtension(filePath));
|
|
response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
|
|
|
|
return response;
|
|
}, cancellationToken);
|
|
}
|
|
}
|
|
|
|
public class FileService : IFileService
|
|
{
|
|
public Stream GetImageAsStream()
|
|
{
|
|
var stream = new MemoryStream(Convert.FromBase64String(Image.Base64Image));
|
|
|
|
return stream;
|
|
}
|
|
|
|
public byte[] GetImageAsByteArray()
|
|
{
|
|
var bytes = Convert.FromBase64String(Image.Base64Image);
|
|
|
|
return bytes;
|
|
}
|
|
}
|
|
public class unterschriftResult : IHttpActionResult
|
|
{
|
|
MemoryStream Unterschrift;
|
|
string Signfilename;
|
|
HttpRequestMessage httpRequestMessage;
|
|
HttpResponseMessage httpResponseMessage;
|
|
|
|
public unterschriftResult(MemoryStream data, HttpRequestMessage request, string filename)
|
|
{
|
|
Unterschrift = data;
|
|
httpRequestMessage = request;
|
|
Signfilename = filename;
|
|
}
|
|
public System.Threading.Tasks.Task<HttpResponseMessage> ExecuteAsync(System.Threading.CancellationToken cancellationToken)
|
|
{
|
|
httpResponseMessage = httpRequestMessage.CreateResponse(HttpStatusCode.OK);
|
|
//httpResponseMessage.Content = new StreamContent(Unterschrift);
|
|
httpResponseMessage.Content = new ByteArrayContent(Unterschrift.ToArray());
|
|
httpResponseMessage.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
|
|
httpResponseMessage.Content.Headers.ContentDisposition.FileName = Signfilename;
|
|
httpResponseMessage.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
|
|
//httpResponseMessage.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeq");
|
|
|
|
return System.Threading.Tasks.Task.FromResult(httpResponseMessage);
|
|
}
|
|
}
|
|
}
|
|
|