In this post you are going to see how to call a web api method from windows forms client to upload image.
First we have to create a WebApi controller named BlogController with a method Post.
web.config file changes for upload limit
then create a windows forms, with one browse button and uplaod button with a link button to browse the uploaded image in the server. Image can be upload as multipart form data where image is send as stream content. we have to get the result using the ContinueWith options of Task factory class
This is the design of our windows forms.Create a delegate to update the control to avoid the cross thread exceptions.
When you click on the link button it will launch that url will launch in browser.
From this post you can learn how to upload a image from windows forms to Web api
First we have to create a WebApi controller named BlogController with a method Post.
public class CheckMimeMultiPart : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if
(!actionContext.Request.Content.IsMimeMultipartContent())
{
throw new
HttpResponseException(System.Net.HttpStatusCode.UnsupportedMediaType);
}
}
}
public class FilePostResult
{
public string FileName { set; get; }
public string Url
{
set;get;
}
public long Size { set; get; }
}
public class BlogController : ApiController
{
public string Get()
{
return "testing";
}
[CheckMimeMultiPart]
public async Task<FilePostResult> Post()
{
try
{
var path = HttpContext.Current.Server.MapPath("~/img");
var streamprovider = new MultipartFormStreamProvider(path);
await Request.Content.ReadAsMultipartAsync(streamprovider);
var streamProvider = await
Request.Content.ReadAsMultipartAsync(); // HERE
foreach (var file in streamProvider.Contents)
{
var imageFilename =
file.Headers.ContentDisposition.FileName.Trim('\"');
var imageStream = await file.ReadAsStreamAsync();
}
var localfilename = streamprovider.FileData.Select(x => x.LocalFileName)
.FirstOrDefault();
var fileinfo = new FileInfo(localfilename);
var response = new FilePostResult();
response.FileName =
fileinfo.Name;
response.Size =
fileinfo.Length;
response.Url =
Request.RequestUri.GetLeftPart(UriPartial.Authority)
+"/img/"
+ response.FileName; ;
return response;
}catch(Exception ex)
{
return new FilePostResult()
{
FileName = "",
Size =0,
Url =
Request.RequestUri.GetLeftPart(UriPartial.Authority)
};
}
}
}
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="30000000" />
</requestFiltering>
</security>
</system.webServer>
<system.web>
<httpRuntime targetFramework="4.6.1" maxRequestLength="30000000" />
</system.web>
then create a windows forms, with one browse button and uplaod button with a link button to browse the uploaded image in the server. Image can be upload as multipart form data where image is send as stream content. we have to get the result using the ContinueWith options of Task factory class
This is the design of our windows forms.Create a delegate to update the control to avoid the cross thread exceptions.
public partial class Form1 : Form
{
DialogResult result;
public delegate void UpdateLink(string text);
public void Update(string text)
{
linkLabel1.Links.Clear();
linkLabel1.Text = text;
linkLabel1.Links.Add(new LinkLabel.Link(0, text.Length, text));
}
private void LinkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start(e.Link.LinkData.ToString());
}
public Form1()
{
InitializeComponent();
openFileDialog1.Filter = "Images (*.JPG;*.BMP;*.PNG;*.GIF)|*.JPG;*.BMP;*.PNG;*.GIF";
openFileDialog1.Multiselect = true;
openFileDialog1.Title = "Browse images";
linkLabel1.LinkClicked +=
LinkLabel1_LinkClicked;
}
private void button1_Click(object sender, EventArgs e)
{
result =
openFileDialog1.ShowDialog();
}
private void button2_Click(object sender, EventArgs e)
{
string address = "http://localhost:57437/api/Blog";
HttpClient client = new HttpClient();
if
(result == DialogResult.OK)
{
try
{
foreach (var item in openFileDialog1.FileNames)
{
var stream = File.Open(item, FileMode.Open);
var multipartcontent = new MultipartFormDataContent();
multipartcontent.Add(new StreamContent(stream),
"\"postimage\"",
string.Format("\"{0}\"", item));
var resulttask =
client.PostAsync(address, multipartcontent);
resulttask.ContinueWith(x => {
if (x.Status == TaskStatus.RanToCompletion)
{
var response =
resulttask.Result;
if
(response.IsSuccessStatusCode)
{
var data =
response.Content.ReadAsStringAsync().Result;
var postresult = JsonConvert.DeserializeObject<FilePostResult>(data);
linkLabel1.BeginInvoke(new UpdateLink(Update), postresult.Url);
foreach (var header in response.Content.Headers)
{
Debug.WriteLine("{0}: {1}", header.Key, string.Join(",", header.Value));
}
}
else
{
Debug.WriteLine("Response :" +
response.Content.ReadAsStringAsync().Result);
}
}
stream.Dispose();
});
}
}
catch (Exception ex)
{
}
}
}
}
When you click on the link button it will launch that url will launch in browser.
From this post you can learn how to upload a image from windows forms to Web api
No comments:
Post a Comment