You Can Use This Sample To Upload Image In Web Api.
First create ImageWriterHelper
to check the file format
public class ImageWriterHelper
{
public enum ImageFormat
{
Bmp,
Jpeg,
Gif,
Tiff,
Png,
Unknown
}
public static ImageFormat GetImageFormat(byte[] bytes)
{
var bmp = Encoding.ASCII.GetBytes("BM");
var gif = Encoding.ASCII.GetBytes("GIF");
var png = new byte[] { 137, 80, 78, 71 };
var tiff = new byte[] { 73, 73, 42 };
var tiff2 = new byte[] { 77, 77, 42 };
var jpeg = new byte[] { 255, 216, 255, 224 };
var jpeg2 = new byte[] { 255, 216, 255, 225 };
if (bmp.SequenceEqual(bytes.Take(bmp.Length)))
return ImageFormat.Bmp;
if (gif.SequenceEqual(bytes.Take(gif.Length)))
return ImageFormat.Gif;
if (png.SequenceEqual(bytes.Take(png.Length)))
return ImageFormat.Png;
if (tiff.SequenceEqual(bytes.Take(tiff.Length)))
return ImageFormat.Tiff;
if (tiff2.SequenceEqual(bytes.Take(tiff2.Length)))
return ImageFormat.Tiff;
if (jpeg.SequenceEqual(bytes.Take(jpeg.Length)))
return ImageFormat.Jpeg;
if (jpeg2.SequenceEqual(bytes.Take(jpeg2.Length)))
return ImageFormat.Jpeg;
return ImageFormat.Unknown;
}
}
Then you should create class for saving image
public class AddCandidateProfilePictureCommand:
IAddCandidateProfilePictureCommand
{
public AddCandidateProfilePictureResponse Execute(HttpPostedFile
postedFile)
{
byte[] fileBytes;
using (var memoryStream = new MemoryStream())
{
postedFile.InputStream.CopyTo(memoryStream);
fileBytes = memoryStream.ToArray();
}
if (ImageWriterHelper.GetImageFormat(fileBytes) ==
ImageWriterHelper.ImageFormat.Unknown)
throw new BadImageFormatException();
var extension = Path.GetExtension(postedFile.FileName);
var tempCandidateImageName = Guid.NewGuid();
var fileName = $"{tempCandidateImageName}{extension}";
var fileUrl =
WebConfigurationManager.AppSettings["CandidateProfilePictureAddress"];
var filePath = Path.Combine(fileUrl, fileName);
if (!Directory.Exists(fileUrl))
Directory.CreateDirectory(fileUrl);
postedFile.SaveAfterResizeImage(filePath, extension);
return new AddCandidateProfilePictureResponse {
TempCandidateImageName = fileName };
}
}
Next create class ImageResizeHelper
to resize the image
public static class ImageResizeHelper
{
public static void SaveAfterResizeImage( this HttpPostedFile
postedFile,string filePath, string extension)
{
postedFile.SaveAs(filePath);
var resizeSetting = new ResizeSettings
{
Width = 500,
Height = 500,
Format = extension
};
ImageBuilder.Current.Build(filePath,ilePath,resizeSetting);
}
}
At the end create action In Controller
[HttpPost]
public IHttpActionResult AddCandidateProfilePicture()
{
var request = HttpContext.Current.Request;
const int maxContentLength = 512 * 512 * 1;
if (request.ContentLength > maxContentLength ||
request.Files.Count == 0)
return BadRequest();
var pictureFile = request.Files[0];
var result =
AddCandidateProfilePictureCommand.Execute(pictureFile);
return Ok(result);
}
I Used constructor injection for creating an instance of classes
please see this link: Uploading Image To Server Using Web API 2.0