Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7792199
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 1, 20262026-06-01T22:06:56+00:00 2026-06-01T22:06:56+00:00

I’m currently having an issue while uploading a file from Html to my rest

  • 0

I’m currently having an issue while uploading a file from Html to my rest service (WCF REST). While uploading a file, I’d like to send information like Title and Description along with the file’s Contents.

So, I’ve created a test form like this:

<form id="testForm" action="http://localhost.:1576/NotepadService.svc/Note/91f6413c-4d72-42ca-a0f3-38df15759fc9/Attachment" method="POST" enctype="multipart/form-data">
        <table>
            <tr><td>Title:</td><td><input type="text" name="Title"></td></tr>
            <tr><td>Description:</td><td><input type="text" name="Description"></td></tr>
            <tr><td>Filename:</td><td><input type="text" name="Filename"></td></tr>
            <tr><td>File:</td><td><input type="file" name="Contents"></td></tr>
            <tr><td/><td><input type="submit" value="Send"></td></tr>
        </table>
    </form>

Server-side, I’d like to translate it to this method:

[OperationContract]
        [WebInvoke(
            BodyStyle = WebMessageBodyStyle.Bare,
            Method = "POST",
            UriTemplate = "/Note/{noteId}/Attachment")]
        [Description("Add an attachment to a Note.")]
        void AddAttachmentToNote(string noteId, AttachmentRequestDto attachmentRequestDto);

With AttachmentRequestDto defined as

[DataContract]
    public class AttachmentRequestDto
    {
         [DataMember]
         public string Title { get; set; }
         [DataMember]
         public string Description { get; set; }
         [DataMember]
         public string Filename { get; set; }
         [DataMember]
         public Stream Contents { get; set; }
    }

So, long story short, I’d like to get the Title and Description as string values, while getting the contents of the file as a stream. This doesn’t seem to work, as the html form will put all the contents of the form (so also Title and Description) into a stream, along with the contents of the file. Therefor, defining my REST method as

[OperationContract]
        [WebInvoke(
            BodyStyle = WebMessageBodyStyle.Bare,
            Method = "POST",
            UriTemplate = "/Note/{noteId}/Attachment")]
        [Description("Add an attachment to a Note.")]
        void AddAttachmentToNote(string noteId, Stream formContents);

works, but then I need to parse the stream to get all of my data (which is not a nice approach, compared to what I actually want to do).

Maybe I need to define 2 different service methods, one accepting only the file, and the other accepting the file’s details? That would, however, mean that my business rules (Title required + filecontents required) should be validated differently (as REST is stateless).

Something that might be worth mentioning: I need to save the file’s contents in the database, not on the file system.

Does anyone have some input on this one? I’m kind of stuck on it…

Thanks!

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-01T22:06:59+00:00Added an answer on June 1, 2026 at 10:06 pm

    Please find some code that might help you to pass a file along with its details in a single call to the REST service:

    First you would need something called a MultipartParser as shown below:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Text.RegularExpressions;
    
    namespace SampleService
    {
        public class MultipartParser
        {
            private byte[] requestData;
            public MultipartParser(Stream stream)
            {
                this.Parse(stream, Encoding.UTF8);
                ParseParameter(stream, Encoding.UTF8);
            }
    
            public MultipartParser(Stream stream, Encoding encoding)
            {
                this.Parse(stream, encoding);
            }
    
            private void Parse(Stream stream, Encoding encoding)
            {
                this.Success = false;
    
                // Read the stream into a byte array
                byte[] data = ToByteArray(stream);
                requestData = data;
    
                // Copy to a string for header parsing
                string content = encoding.GetString(data);
    
                // The first line should contain the delimiter
                int delimiterEndIndex = content.IndexOf("\r\n");
    
                if (delimiterEndIndex > -1)
                {
                    string delimiter = content.Substring(0, content.IndexOf("\r\n"));
    
                    // Look for Content-Type
                    Regex re = new Regex(@"(?<=Content\-Type:)(.*?)(?=\r\n\r\n)");
                    Match contentTypeMatch = re.Match(content);
    
                    // Look for filename
                    re = new Regex(@"(?<=filename\=\"")(.*?)(?=\"")");
                    Match filenameMatch = re.Match(content);
    
                    // Did we find the required values?
                    if (contentTypeMatch.Success && filenameMatch.Success)
                    {
                        // Set properties
                        this.ContentType = contentTypeMatch.Value.Trim();
                        this.Filename = filenameMatch.Value.Trim();
    
                        // Get the start & end indexes of the file contents
                        int startIndex = contentTypeMatch.Index + contentTypeMatch.Length + "\r\n\r\n".Length;
    
                        byte[] delimiterBytes = encoding.GetBytes("\r\n" + delimiter);
                        int endIndex = IndexOf(data, delimiterBytes, startIndex);
    
                        int contentLength = endIndex - startIndex;
    
                        // Extract the file contents from the byte array
                        byte[] fileData = new byte[contentLength];
    
                        Buffer.BlockCopy(data, startIndex, fileData, 0, contentLength);
    
                        this.FileContents = fileData;
                        this.Success = true;
                    }
                }
            }
    
            private void ParseParameter(Stream stream, Encoding encoding)
            {
                this.Success = false;
    
                // Read the stream into a byte array
                byte[] data;
                if (requestData.Length == 0)
                {
                    data = ToByteArray(stream);
                }
                else { data = requestData; }
                // Copy to a string for header parsing
                string content = encoding.GetString(data);
    
                // The first line should contain the delimiter
                int delimiterEndIndex = content.IndexOf("\r\n");
    
                if (delimiterEndIndex > -1)
                {
                    string delimiter = content.Substring(0, content.IndexOf("\r\n"));
                    string[] splitContents = content.Split(new[] {delimiter}, StringSplitOptions.RemoveEmptyEntries);
                    foreach (string t in splitContents)
                    {
                        // Look for Content-Type
                        Regex contentTypeRegex = new Regex(@"(?<=Content\-Type:)(.*?)(?=\r\n\r\n)");
                        Match contentTypeMatch = contentTypeRegex.Match(t);
    
                        // Look for name of parameter
                        Regex re = new Regex(@"(?<=name\=\"")(.*)");
                        Match name = re.Match(t);
    
                        // Look for filename
                        re = new Regex(@"(?<=filename\=\"")(.*?)(?=\"")");
                        Match filenameMatch = re.Match(t);
    
                        // Did we find the required values?
                        if (name.Success || filenameMatch.Success)
                        {
                            // Set properties
                            //this.ContentType = name.Value.Trim();
                            int startIndex;
                            if (filenameMatch.Success)
                            {
                                this.Filename = filenameMatch.Value.Trim();
                            }
                            if(contentTypeMatch.Success)
                            {
                                // Get the start & end indexes of the file contents
                                startIndex = contentTypeMatch.Index + contentTypeMatch.Length + "\r\n\r\n".Length;
                            }
                            else
                            {
                                startIndex = name.Index + name.Length + "\r\n\r\n".Length;
                            }
    
                            //byte[] delimiterBytes = encoding.GetBytes("\r\n" + delimiter);
                            //int endIndex = IndexOf(data, delimiterBytes, startIndex);
    
                            //int contentLength = t.Length - startIndex;
                            string propertyData = t.Substring(startIndex - 1, t.Length - startIndex);
                            // Extract the file contents from the byte array
                            //byte[] paramData = new byte[contentLength];
    
                            //Buffer.BlockCopy(data, startIndex, paramData, 0, contentLength);
    
                            MyContent myContent = new MyContent();
                            myContent.Data = encoding.GetBytes(propertyData);
                            myContent.StringData = propertyData;
                            myContent.PropertyName = name.Value.Trim();
    
                            if (MyContents == null)
                                MyContents = new List<MyContent>();
    
                            MyContents.Add(myContent);
                            this.Success = true;
                        }
                    }
                }
            }
    
            private int IndexOf(byte[] searchWithin, byte[] serachFor, int startIndex)
            {
                int index = 0;
                int startPos = Array.IndexOf(searchWithin, serachFor[0], startIndex);
    
                if (startPos != -1)
                {
                    while ((startPos + index) < searchWithin.Length)
                    {
                        if (searchWithin[startPos + index] == serachFor[index])
                        {
                            index++;
                            if (index == serachFor.Length)
                            {
                                return startPos;
                            }
                        }
                        else
                        {
                            startPos = Array.IndexOf<byte>(searchWithin, serachFor[0], startPos + index);
                            if (startPos == -1)
                            {
                                return -1;
                            }
                            index = 0;
                        }
                    }
                }
    
                return -1;
            }
    
            private byte[] ToByteArray(Stream stream)
            {
                byte[] buffer = new byte[32768];
                using (MemoryStream ms = new MemoryStream())
                {
                    while (true)
                    {
                        int read = stream.Read(buffer, 0, buffer.Length);
                        if (read <= 0)
                            return ms.ToArray();
                        ms.Write(buffer, 0, read);
                    }
                }
            }
    
            public List<MyContent> MyContents { get; set; }
    
            public bool Success
            {
                get;
                private set;
            }
    
            public string ContentType
            {
                get;
                private set;
            }
    
            public string Filename
            {
                get;
                private set;
            }
    
            public byte[] FileContents
            {
                get;
                private set;
            }
        }
    
        public class MyContent
        {
            public byte[] Data { get; set; }
            public string PropertyName { get; set; }
            public string StringData { get; set; }
        }
    }
    

    Now define your REST method as shown:

    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    AttachmentRequestDto AddAttachmentToNote(Stream stream);
    

    Now the implemenation of the above method as shown:

    public AttachmentRequestDto AddAttachmentToNote(Stream stream)
            {
                MultipartParser parser = new MultipartParser(stream);
                if(parser != null && parser.Success)
                {
                    foreach (var content in parser.MyContents)
                    {
                        // Observe your string here which is a serialized version of your file or the object being passed. Based on the string do the necessary action.
                        string str = Encoding.UTF8.GetString(content.Data);
    
                    }
                }
    
                return new AttachmentRequestDto();
            }
    

    My AttachmentRequestDto looks as shown:

    [DataContract]
        public class AttachmentRequestDto
        {
             [DataMember]
             public string Title { get; set; }
             [DataMember]
             public string Description { get; set; }
             [DataMember]
             public string Filename { get; set; }
        }
    

    Now from the client i do perform a POST as shown :

    Image image = Image.FromFile("C:\\Users\\Guest\\Desktop\\sample.png");
    MemoryStream ms = new MemoryStream();
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    byte[] imageArray = ms.ToArray();
    ms.Close();
    
    AttachmentRequestDto objAttachmentRequestDto = new AttachmentRequestDto();
    objAttachmentRequestDto.Title = "Sample";
    objAttachmentRequestDto.Description = "Sample book";
    objAttachmentRequestDto.FileName = "SampleBook.png";
    
    var serializer = new DataContractSerializer(typeof(AttachmentRequestDto));
    var ms = new MemoryStream();
    serializer.WriteObject(ms, objAttachmentRequestDto);
    ms.Position = 0;
    var reader = new StreamReader(ms);
    string requestBody = reader.ReadToEnd();
    
    var client = new RestClient();            
    client.BaseUrl = "http://localhost/SampleService/Service1.svc";
    var request = new RestRequest(method) { DateFormat = DataFormat.Xml.ToString(), Resource = resourceUrl };
    if(requestBody !=null)
          request.AddParameter("objAttachmentRequestDto", requestBody);
    request.AddFile("stream", image, "Array.png");
    var response = client.Execute(request);
    

    I do use a third party dll for the above code called RESTSharp.

    Once on the server the MultipartParser identifies your request boundary to split the necessary contents and then you can decide on what to do with each of the split contents (save to file,db, etc..)

    Just make sure you have the approriate config entries for the above as well along with dataContractSerializer property and readerQuotas set for the webHttpBinding.

    NOTE: The MultipartParser can be more re-factored if needed.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

link Im having trouble converting the html entites into html characters, (&# 8217;) i
For some reason, after submitting a string like this Jack’s Spindle from a text
I have a string like this: La Torre Eiffel paragonata all&#8217;Everest What PHP function
I want use html5's new tag to play a wav file (currently only supported
I am trying to render a haml file in a javascript response like so:
I am currently running into a problem where an element is coming back from
I'm trying to decode HTML entries from here NYTimes.com and I cannot figure out
I have just tried to save a simple *.rtf file with some websites and
I would like to count the length of a string with PHP. The string
I've got a string that has curly quotes in it. I'd like to replace

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.