How To Accept a File POST

前端 未结 13 1430
深忆病人
深忆病人 2020-11-22 09:48

I\'m using asp.net mvc 4 webapi beta to build a rest service. I need to be able to accept POSTed images/files from client applications. Is this possible using the webapi?

相关标签:
13条回答
  • 2020-11-22 09:58

    see http://www.asp.net/web-api/overview/formats-and-model-binding/html-forms-and-multipart-mime#multipartmime, although I think the article makes it seem a bit more complicated than it really is.

    Basically,

    public Task<HttpResponseMessage> PostFile() 
    { 
        HttpRequestMessage request = this.Request; 
        if (!request.Content.IsMimeMultipartContent()) 
        { 
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
        } 
    
        string root = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/uploads"); 
        var provider = new MultipartFormDataStreamProvider(root); 
    
        var task = request.Content.ReadAsMultipartAsync(provider). 
            ContinueWith<HttpResponseMessage>(o => 
        { 
    
            string file1 = provider.BodyPartFileNames.First().Value;
            // this is the file name on the server where the file was saved 
    
            return new HttpResponseMessage() 
            { 
                Content = new StringContent("File uploaded.") 
            }; 
        } 
        ); 
        return task; 
    } 
    
    0 讨论(0)
  • 2020-11-22 09:58

    The ASP.NET Core way is now here:

    [HttpPost("UploadFiles")]
    public async Task<IActionResult> Post(List<IFormFile> files)
    {
        long size = files.Sum(f => f.Length);
    
        // full path to file in temp location
        var filePath = Path.GetTempFileName();
    
        foreach (var formFile in files)
        {
            if (formFile.Length > 0)
            {
                using (var stream = new FileStream(filePath, FileMode.Create))
                {
                    await formFile.CopyToAsync(stream);
                }
            }
        }
    
        // process uploaded files
        // Don't rely on or trust the FileName property without validation.
    
        return Ok(new { count = files.Count, size, filePath});
    }
    
    0 讨论(0)
  • 2020-11-22 10:03
    [HttpPost]
    public JsonResult PostImage(HttpPostedFileBase file)
    {
        try
        {
            if (file != null && file.ContentLength > 0 && file.ContentLength<=10485760)
            {
                var fileName = Path.GetFileName(file.FileName);                                        
    
                var path = Path.Combine(Server.MapPath("~/") + "HisloImages" + "\\", fileName);
    
                file.SaveAs(path);
                #region MyRegion
                ////save imag in Db
                //using (MemoryStream ms = new MemoryStream())
                //{
                //    file.InputStream.CopyTo(ms);
                //    byte[] array = ms.GetBuffer();
                //} 
                #endregion
                return Json(JsonResponseFactory.SuccessResponse("Status:0 ,Message: OK"), JsonRequestBehavior.AllowGet);
            }
            else
            {
                return Json(JsonResponseFactory.ErrorResponse("Status:1 , Message: Upload Again and File Size Should be Less Than 10MB"), JsonRequestBehavior.AllowGet);
            }
        }
        catch (Exception ex)
        {
    
            return Json(JsonResponseFactory.ErrorResponse(ex.Message), JsonRequestBehavior.AllowGet);
    
        }
    }
    
    0 讨论(0)
  • 2020-11-22 10:05

    I used Mike Wasson's answer before I updated all the NuGets in my webapi mvc4 project. Once I did, I had to re-write the file upload action:

        public Task<HttpResponseMessage> Upload(int id)
        {
            HttpRequestMessage request = this.Request;
            if (!request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.UnsupportedMediaType));
            }
    
            string root = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/uploads");
            var provider = new MultipartFormDataStreamProvider(root);
    
            var task = request.Content.ReadAsMultipartAsync(provider).
                ContinueWith<HttpResponseMessage>(o =>
                {
                    FileInfo finfo = new FileInfo(provider.FileData.First().LocalFileName);
    
                    string guid = Guid.NewGuid().ToString();
    
                    File.Move(finfo.FullName, Path.Combine(root, guid + "_" + provider.FileData.First().Headers.ContentDisposition.FileName.Replace("\"", "")));
    
                    return new HttpResponseMessage()
                    {
                        Content = new StringContent("File uploaded.")
                    };
                }
            );
            return task;
        }
    

    Apparently BodyPartFileNames is no longer available within the MultipartFormDataStreamProvider.

    0 讨论(0)
  • 2020-11-22 10:06

    API Controller :

    [HttpPost]
    public HttpResponseMessage Post()
    {
        var httpRequest = System.Web.HttpContext.Current.Request;
    
        if (System.Web.HttpContext.Current.Request.Files.Count < 1)
        {
            //TODO
        }
        else
        {
    
        try
        { 
            foreach (string file in httpRequest.Files)
            { 
                var postedFile = httpRequest.Files[file];
                BinaryReader binReader = new BinaryReader(postedFile.InputStream);
                byte[] byteArray = binReader.ReadBytes(postedFile.ContentLength);
    
            }
    
        }
        catch (System.Exception e)
        {
            //TODO
        }
    
        return Request.CreateResponse(HttpStatusCode.Created);
    }
    
    0 讨论(0)
  • 2020-11-22 10:08

    Complementing Matt Frear's answer - This would be an ASP NET Core alternative for reading the file directly from Stream, without saving&reading it from disk:

    public ActionResult OnPostUpload(List<IFormFile> files)
        {
            try
            {
                var file = files.FirstOrDefault();
                var inputstream = file.OpenReadStream();
    
                XSSFWorkbook workbook = new XSSFWorkbook(stream);
    
                var FIRST_ROW_NUMBER = {{firstRowWithValue}};
    
                ISheet sheet = workbook.GetSheetAt(0);
                // Example: var firstCellRow = (int)sheet.GetRow(0).GetCell(0).NumericCellValue;
    
                for (int rowIdx = 2; rowIdx <= sheet.LastRowNum; rowIdx++)
                   {
                      IRow currentRow = sheet.GetRow(rowIdx);
    
                      if (currentRow == null || currentRow.Cells == null || currentRow.Cells.Count() < FIRST_ROW_NUMBER) break;
    
                      var df = new DataFormatter();                
    
                      for (int cellNumber = {{firstCellWithValue}}; cellNumber < {{lastCellWithValue}}; cellNumber++)
                          {
                             //business logic & saving data to DB                        
                          }               
                    }
            }
            catch(Exception ex)
            {
                throw new FileFormatException($"Error on file processing - {ex.Message}");
            }
        }
    
    0 讨论(0)
提交回复
热议问题