微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

file-upload – .NET Core – Web API – 如何进行文件上传?

我无法弄清楚,如何编写.NET Core Web API来支持文件上传.请注意我没有使用ASP.NET Core MVC表单进行文件上传,而是使用Servlet / JSP容器.
这是我的project.json的定义方式,
{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1","type": "platform"
    },"Microsoft.AspNetCore.Mvc": "1.0.1","Microsoft.AspNetCore.Routing": "1.0.1","Microsoft.AspNetCore.Server.IISIntegration": "1.0.0","Microsoft.AspNetCore.Server.Kestrel": "1.0.1","Microsoft.Extensions.Configuration.Environmentvariables": "1.0.0","Microsoft.Extensions.Configuration.FileExtensions": "1.0.0","Microsoft.Extensions.Configuration.Json": "1.0.0","Microsoft.Extensions.Logging": "1.0.0","Microsoft.Extensions.Logging.Console": "1.0.0","Microsoft.Extensions.Logging.Debug": "1.0.0","Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0","Npgsql": "3.1.9","CoreCompat.Newtonsoft.Json": "9.0.2-beta001","Newtonsoft.Json": "9.0.1"
  },"tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
  },"frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6","portable-net45+win8"
      ]
    }
  },"buildOptions": {
    "emitEntryPoint": true,"preserveCompilationContext": true
  },"runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },"publishOptions": {
    "include": [
      "wwwroot","**/*.cshtml","appsettings.json","web.config"
    ]
  },"scripts": {
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

这是我的Startup的定义方式,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

using QCService.Models;

namespace QCService
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json",optional: true,reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional: true)
                .AddEnvironmentvariables();
            Configuration = builder.Build();
        }

        public IConfigurationRoot Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddMvc();

            //Add SurveysRepository for Dependency Injection
            services.AddSingleton<ISurveysRepository,SurveysRepository>();
            //Add FeedbacksRepository for Dependency Injection
            services.AddSingleton<IFeedbacksRepository,FeedbacksRepository>();
            //Add AttachmentsRepository for Dependency Injection
            services.AddSingleton<IAttachmentsRepository,AttachmentsRepository>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app,IHostingEnvironment env,ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            app.UseMvc();
        }
    }
}

最后,我的控制器是如何定义的,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
//Including model classes for Attachments
using QCService.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Hosting;
using System.IO;
using Microsoft.Net.Http.Headers;

// For more information on enabling Web API for empty projects,visit http://go.microsoft.com/fwlink/?LinkID=397860

namespace QCService.Controllers
{
    [Route("api/[controller]")]
    public class AttachmentsController : Controller
    {
        public IAttachmentsRepository AttachmentItems { get; set; }
        public AttachmentsController(IAttachmentsRepository attachmentItems)
        {
            AttachmentItems = attachmentItems;
        }

        // GET: api/Attachments
        [HttpGet] /*http://localhost:52770/api/Attachments*/
        public IEnumerable<Attachments> Get()
        {
            return AttachmentItems.GetAllAttachments();
        }

        // GET api/Attachments/5
        [HttpGet("{id}")] /*http://localhost:52770/api/Attachments/{AttachmentID}*/
        public Attachments Get(int id)
        {
            return AttachmentItems.GetAttachment(id);
        }

        // GET api/Attachments/5
        [HttpGet("Feedback/{id}")] /*http://localhost:52770/api/Attachments/Feedback/{FeedbackID}*/
        public IEnumerable<Attachments> GetFeedbackAttachments(int id)
        {
            return AttachmentItems.GetFeedbackAttachments(id);
        }

        // POST api/Attachments
        [HttpPost]/*http://localhost:52770/api/Attachments/*/
        public async Task<IActionResult> PostFiles(ICollection<IFormFile> files)
        {
            try
            {
                System.Console.WriteLine("You received the call!");
                WriteLog("PostFiles call received!",true);
                //We would always copy the attachments to the folder specified above but for Now dump it wherver....
                long size = files.Sum(f => f.Length);

                // full path to file in temp location
                var filePath = Path.GetTempFileName();
                var fileName = Path.GetTempFileName();

                foreach (var formFile in files)
                {
                    if (formFile.Length > 0)
                    {
                        using (var stream = new FileStream(filePath,FileMode.Create))
                        {
                            await formFile.copyToAsync(stream);
                            //formFile.copyToAsync(stream);
                        }
                    }
                }

                // process uploaded files
                // Don't rely on or trust the FileName property without validation.
                //displaying File Name for verification purposes for Now -Rohit

                return Ok(new { count = files.Count,fileName,size,filePath });
            }
            catch (Exception exp)
            {
                System.Console.WriteLine("Exception generated when uploading file - " + exp.Message);
                WriteLog("Exception generated when uploading file - " + exp.Message,true);
                string message = $"file / upload Failed!";
                return Json(message);
            }
        }

        /// <summary>
        /// Writes a log entry to the local file system
        /// </summary>
        /// <param name="Message">Message to be written to the log file</param>
        /// <param name="InsertNewLine">Inserts a new line</param>
        public void WriteLog(string Message,bool InsertNewLine)
        {
            LogActivity ologobject = null;
            try
            {
                string MessageString = (InsertNewLine == true ? Environment.NewLine : "") + Message;
                if (ologobject == null)
                    ologobject = LogActivity.Getlogobject();
                ologobject.WriteLog(Message,InsertNewLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unable to write to the log file : " + ex.Message);
                Console.WriteLine("Stack Trace : " + ex.StackTrace);
            }
        }
    }
}

我已经通过这个链接,
https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads
但只是不能让它工作!
任何帮助表示赞赏!

我使用Google的Advanced Rest Client发布数据如下,
This is how I am sending the POST request

随着以下消息,我不断收到回复
状态:
500内部服务器错误
加载时间:62毫秒
响应标头

请求标头
2
重定向
0
计时
内容类型:multipart / form-data;边界= —- WebKitFormBoundary0RKUhduCjSNZOEMN
内容长度:9106
来源消息

POST / api / Attachments HTTP / 1.1
主持人:localhost:52770
content-type:multipart / form-data;边界= —- WebKitFormBoundary0RKUhduCjSNZOEMN
内容长度:9106

—— WebKitFormBoundary0RKUhduCjSNZOEMN
内容处理:表格数据; NAME = “fileUpload1”;文件名= “1i4ymeoyov_In_the_Wild_Testing.png”
内容类型:image / png

PNG

IHDR,I 3(tEXtSoftwareAdobeImageReadyq e< iTXtXML:com.adobe.xmp 8
^2IDATx ]pU @a H Pe P8 Ȉ b ̌3 p q * 7“ h Yf O atD (< h | dlxdOH =} }ov8_U .....
—— WebKitFormBoundary0RKUhduCjSNZOEMN–

解决方法

这是根本原因:form-data; NAME = “fileUpload1”

你的名字“fileUpload1”必须是“文件”,它与动作PostFiles的声明相符(ICollection< IFormFile>文件)

原文地址:https://www.jb51.cc/netcore/225826.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐