Search code examples
c#asp.net-web-apifilestreammultipartform-data

how to remove content from images when using multipart


so I made an uploader in my web API by using multipart form data but the problem is when I save my pictures from the file stream it also gave me the content here

 -----------------------------7e1e364095c
Content-Disposition: form-data; name="file"; filename="C:\Users\kewin\Downloads\windows 10 pro.jpg"
Content-Type: image/jpeg

 the binary starts from here        

and if i remove thoose 4 lines i can watch my picture so are there any way to remove that so I am only left with the picture

    public async Task<IHttpActionResult> UploadImage(string fileName = "")
    {
        if (fileName == "")
        {
            fileName = Guid.NewGuid().ToString();
        }
            if (!Request.Content.IsMimeMultipartContent("form-data"))
        {
            return BadRequest("Could not find file to upload");
        }
        var provider = await Request.Content.ReadAsMultipartAsync(new InMemoryMultipartFormDataStreamProvider());

        var files = provider.Files;
        var uploadedFile = files[0];
        var extension = ExtractExtension(uploadedFile);
        var contentType = uploadedFile.Headers.ContentType.ToString();
        var savePath = ConfigurationManager.AppSettings["savePath"];
        var file = string.Concat(savePath, fileName, extension);

        try
        {
            var request = HttpContext.Current.Request;
            var fileDir = file + request.Headers[""];
            using (var fs = new FileStream(fileDir, FileMode.Create))
            {
                request.InputStream.CopyTo(fs);
            }
            return Ok();
        }

        catch (StorageException e)
        {
            return BadRequest(e.Message);
        }

        try
        {
                var fileInfo = new UploadedFileInfo
            {
                FileName = fileName,
                FileExtension = extension,
                ContentType = contentType,
                FilePath = savePath + imageFile
            };
            return Ok(fileInfo);
        }

Solution

  • Currently you read picture data from request.InputStream, which contains whole unparsed multipart content, including headers you don't need. Instead, you should read picture data from InMemoryMultipartFormDataStreamProvider you created, which parses input stream and provides you simple access to headers and data stream of individual uploaded file(s).

    ....
    var provider = await Request.Content.ReadAsMultipartAsync(new InMemoryMultipartFormDataStreamProvider());
    
    var files = provider.Files;
    var uploadedFile = files[0];
    var extension = ExtractExtension(uploadedFile);
    var contentType = uploadedFile.Headers.ContentType.ToString();
    var savePath = ConfigurationManager.AppSettings["savePath"];
    var file = string.Concat(savePath, fileName, extension);
    
    try
    {
        using (var fs = new FileStream(file, FileMode.Create))
        {
            await uploadedFile.CopyToAsync(fs);
        }
        return Ok();
    }
    ....