0

I was trying to upload a file to a web server through UWP c# using filestream but it always gives me an error i.e 405 method not allowed when I try to upload on http://example.com/httpdocs/content. Even for testing purpose I tried uploading on my localhost but still no luck. Any Help?

Code :

 public async Task<bool> Upload(StorageFile fileName)
    {
        HttpMultipartFormDataContent form = new HttpMultipartFormDataContent();
        cts = new CancellationTokenSource();

        using (IInputStream fileStream = await fileName.OpenSequentialReadAsync())
        {
            HttpStreamContent content = new HttpStreamContent(fileStream);               
            form.Add(content, "premier", fileName.Name);

            using (HttpClient client = new HttpClient())
            {
                using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri("http://example.com/httpdocs/content")))
                {
                    request.Content = form;
                    request.Headers.TryAppendWithoutValidation("Content-Type", "application/x-www-form-urlencoded");                       
                    HttpResponseMessage response = await client.SendRequestAsync(request).AsTask(cts.Token);
                    var result = response.Content.ReadAsStringAsync().GetResults();
                }                   
            }
        }

        return true;
    }
Uwe Keim
  • 39,551
  • 56
  • 175
  • 291
Rinkesh
  • 21
  • 8

1 Answers1

0

Hye, after trying much I found this code and it works perfectly. With a little correction that the request will be now sent to an aspx page i.e. http://example.com/abc.aspx. If you wanna send high mb's of excel file data then just change 4096 in Math.Min(4096, (int)fileStream.Length) accordingly

Client Side Code-

   public static async Task<string> UploadFileEx(string uploadfile, string 
   url, string fileFormName, string contenttype, NameValueCollection 
   querystring, CookieContainer cookies)
    {
        try
        {
            if ((fileFormName == null) ||
                (fileFormName.Length == 0))
            {
                fileFormName = "file";
            }

            if ((contenttype == null) ||
                (contenttype.Length == 0))
            {
                contenttype = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            }
            string postdata;
            postdata = "?";
            if (querystring != null)
            {
                foreach (string key in querystring.Keys)
                {
                    postdata += key + "=" + querystring.Get(key) + "&";
                }
            }
            Uri uri = new Uri(url + postdata);


            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
            webrequest.CookieContainer = cookies;
            webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
            webrequest.Method = "POST";

            // Build up the post message header
            StringBuilder sb = new StringBuilder();
            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            var sd = sb.Append(Path.GetFileName(uploadfile));
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: ");
            sb.Append(contenttype);
            sb.Append("\r\n");
            sb.Append("\r\n");

            string postHeader = sb.ToString();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);

            // Build the trailing boundary string as a byte array
            // ensuring the boundary appears on a line by itself
            byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

            FileStream fileStream = new FileStream(uploadfile, FileMode.Open, FileAccess.Read);
            long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
            //  webrequest.ContentLength = length;
            webrequest.Headers[HttpRequestHeader.ContentLength] = length.ToString();

            //Stream requestStream = webrequest.GetRequestStream();
            Stream requestStream = await webrequest.GetRequestStreamAsync();

            // Write out our post header
            requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

            // Write out the file contents
            byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
            int bytesRead = 0;
             while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                requestStream.Write(buffer, 0, bytesRead);

            // Write out the trailing boundary
            requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
            WebResponse response = await webrequest.GetResponseAsync();
            Stream s = response.GetResponseStream();
            StreamReader sr = new StreamReader(s);

            return sr.ReadToEnd();
        }

        catch (Exception e)
        {
            e.ToString();
        }
        return null;
    }
Rinkesh
  • 21
  • 8