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();
}
@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