Skip to content

Instantly share code, notes, and snippets.

@mirsaeedi
Created October 6, 2016 08:37
Show Gist options
  • Save mirsaeedi/ae6462906be7f6c8021abbc22ccef4e9 to your computer and use it in GitHub Desktop.
Save mirsaeedi/ae6462906be7f6c8021abbc22ccef4e9 to your computer and use it in GitHub Desktop.
Helps you to save uploaded files to disk in ASP.Net Web API. The SaveFile method works with Request object directly.
public async Task<IHttpActionResult> SaveFile(string diskFolderPath)
{
var path = Path.GetTempPath();
if (!Request.Content.IsMimeMultipartContent("form-data"))
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType));
}
MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider(path);
await Request.Content.ReadAsMultipartAsync(streamProvider);
foreach (MultipartFileData fileData in streamProvider.FileData)
{
string fileName = "";
if (string.IsNullOrEmpty(fileData.Headers.ContentDisposition.FileName))
{
fileName = Guid.NewGuid().ToString();
}
fileName = fileData.Headers.ContentDisposition.FileName;
if (fileName.StartsWith("\"") && fileName.EndsWith("\""))
{
fileName = fileName.Trim('"');
}
if (fileName.Contains(@"/") || fileName.Contains(@"\"))
{
fileName = Path.GetFileName(fileName);
}
var newFileName = Path.Combine(HostingEnvironment.MapPath("~" + diskFolderPath), fileName);
var fileInfo = new FileInfo(newFileName);
if (fileInfo.Exists)
{
fileName = fileInfo.Name.Replace(fileInfo.Extension, "");
fileName = fileName + (new Random().Next(0, 10000)) + fileInfo.Extension;
newFileName = Path.Combine(HostingEnvironment.MapPath(diskFolderPath), fileName);
}
if (!Directory.Exists(fileInfo.Directory.FullName))
{
Directory.CreateDirectory(fileInfo.Directory.FullName);
}
File.Move(fileData.LocalFileName, newFileName);
return Json(new { link = diskFolderPath + fileName });
}
return BadRequest();
}
@mirsaeedi
Copy link
Author

You can call this methods in your controller like this
return await SaveFile("/Files/Provision/Food/Images/");

@RickvanOsta
Copy link

At line 19 you set the fileName variable conditionally, and after that you set it anyway. The entire if-statement is useless.

@serkanince
Copy link

thanks for share.

*21 to 29 line needs to be else statement

@kudchikarsk
Copy link

kudchikarsk commented Apr 14, 2020

using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Hosting;
using System.Web.Http;

namespace WebApi.Controllers
{
    public class BaseController : ApiController
    {
        public async Task<IHttpActionResult> SaveFile(string diskFolderPath)
        {
            var path = Path.GetTempPath();

            if (!Request.Content.IsMimeMultipartContent("form-data"))
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType));
            }

            MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider(path);

            await Request.Content.ReadAsMultipartAsync(streamProvider);

            foreach (MultipartFileData fileData in streamProvider.FileData)
            {
                string fileName = "";

                if (string.IsNullOrEmpty(fileData.Headers.ContentDisposition.FileName))
                {
                    fileName = Guid.NewGuid().ToString();
                }
                else
                {
                    fileName = fileData.Headers.ContentDisposition.FileName;
                    if (fileName.StartsWith("\"") && fileName.EndsWith("\""))
                    {
                        fileName = fileName.Trim('"');
                    }
                    if (fileName.Contains(@"/") || fileName.Contains(@"\"))
                    {
                        fileName = Path.GetFileName(fileName);
                    }
                }
                var newFileName = Path.Combine(HostingEnvironment.MapPath("~" + diskFolderPath), fileName);
                var fileInfo = new FileInfo(newFileName);
                while(fileInfo.Exists)
                {
                    fileName = fileInfo.Name.Replace(fileInfo.Extension, "");
                    fileName = fileName + Guid.NewGuid().ToString() + fileInfo.Extension;

                    newFileName = Path.Combine(HostingEnvironment.MapPath(diskFolderPath), fileName);
                    fileInfo = new FileInfo(newFileName);
                }

                if (!Directory.Exists(fileInfo.Directory.FullName))
                {
                    Directory.CreateDirectory(fileInfo.Directory.FullName);
                }


                File.Move(fileData.LocalFileName, newFileName);

                return Json(new { link = diskFolderPath + fileName });
            }

            return BadRequest();
        }
    }
}

@kudchikarsk
Copy link

using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Hosting;
using System.Web.Http;

namespace WebApi.Controllers
{
    public class BaseController : ApiController
    {
        public async Task<IHttpActionResult> SaveFile(string diskFolderPath)
        {
            var path = Path.GetTempPath();

            if (!Request.Content.IsMimeMultipartContent("form-data"))
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType));
            }

            MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider(path);

            await Request.Content.ReadAsMultipartAsync(streamProvider);

            foreach (MultipartFileData fileData in streamProvider.FileData)
            {
                string fileName = "";

                if (string.IsNullOrEmpty(fileData.Headers.ContentDisposition.FileName))
                {
                    fileName = Guid.NewGuid().ToString();
                }
                else
                {
                    fileName = fileData.Headers.ContentDisposition.FileName;
                    if (fileName.StartsWith("\"") && fileName.EndsWith("\""))
                    {
                        fileName = fileName.Trim('"');
                    }
                    if (fileName.Contains(@"/") || fileName.Contains(@"\"))
                    {
                        fileName = Path.GetFileName(fileName);
                    }
                }
                var newFileName = Path.Combine(HostingEnvironment.MapPath("~" + diskFolderPath), fileName);
                var fileInfo = new FileInfo(newFileName);
                while(fileInfo.Exists)
                {
                    fileName = fileInfo.Name.Replace(fileInfo.Extension, "");
                    fileName = fileName + Guid.NewGuid().ToString() + fileInfo.Extension;

                    newFileName = Path.Combine(HostingEnvironment.MapPath(diskFolderPath), fileName);
                    fileInfo = new FileInfo(newFileName);
                }

                if (!Directory.Exists(fileInfo.Directory.FullName))
                {
                    Directory.CreateDirectory(fileInfo.Directory.FullName);
                }


                File.Move(fileData.LocalFileName, newFileName);

                return Json(new { link = diskFolderPath + fileName });
            }

            return BadRequest();
        }
    }
}

Here I fixed some bugs like creating random filename and else statement

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment