【问题标题】:Uploading image in ASP.NET Boilerplate在 ASP.NET 样板中上传图像
【发布时间】:2018-04-25 20:09:20
【问题描述】:

发布图片时,HttpContext.Current.Requestnull

有没有什么简单的方法可以做到这一点?我在客户端使用 dropzone.js

项目是带有 Web API (ASP.NET Core 2.0) 模板的 Angular。

[HttpPost]      
public HttpResponseMessage UploadJsonFile()
{
    HttpResponseMessage response = new HttpResponseMessage();           
    var httpRequest = HttpContext.Current.Request;
    if (httpRequest.Files.Count > 0)
    {
        foreach (string file in httpRequest.Files)
        {
            var postedFile = httpRequest.Files[file];
            var filePath = HttpContext.Current.Server.MapPath("~/UploadFile/" + postedFile.FileName);
            postedFile.SaveAs(filePath);
        }
    }
    return response;
}

【问题讨论】:

    标签: c# asp.net-web-api asp.net-web-api2 image-uploading aspnetboilerplate


    【解决方案1】:

    这是我完成的代码,它工作正常。

    public void PostFile(IFormFile file)
    {          
        var uploads = Path.Combine("ROOT PATH FOR THE FILES", "uploads");
    
        if (file.Length > 0)
        {
            var filePath = Path.Combine(uploads, file.FileName);
    
            using (var fileStream = new FileStream(filePath, FileMode.Create))
            {
                file.CopyTo(fileStream);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      首先,我们需要使用IOperationFilter 在 Swagger 中启用文件上传。创建一个继承自IOperationFilter 的类。详情请阅读this article

      public class FormFileSwaggerFilter: IOperationFilter
      {
          private const string formDataMimeType = "multipart/form-data";
          private static readonly string[] formFilePropertyNames =
              typeof(IFormFile).GetTypeInfo().DeclaredProperties.Select(p => p.Name).ToArray();
      
          public void Apply(Operation operation, OperationFilterContext context)
          {
              var parameters = operation.Parameters;
              if (parameters == null || parameters.Count == 0) return;
      
              var formFileParameterNames = new List<string>();
              var formFileSubParameterNames = new List<string>();
      
              foreach (var actionParameter in context.ApiDescription.ActionDescriptor.Parameters)
              {
                  var properties =
                      actionParameter.ParameterType.GetProperties()
                          .Where(p => p.PropertyType == typeof(IFormFile))
                          .Select(p => p.Name)
                          .ToArray();
      
                  if (properties.Length != 0)
                  {
                      formFileParameterNames.AddRange(properties);
                      formFileSubParameterNames.AddRange(properties);
                      continue;
                  }
      
                  if (actionParameter.ParameterType != typeof(IFormFile)) continue;
                  formFileParameterNames.Add(actionParameter.Name);
              }
      
              if (!formFileParameterNames.Any()) return;
      
              var consumes = operation.Consumes;
              consumes.Clear();
              consumes.Add(formDataMimeType);
      
              foreach (var parameter in parameters.ToArray())
              {
                  if (!(parameter is NonBodyParameter) || parameter.In != "formData") continue;
      
                  if (formFileSubParameterNames.Any(p => parameter.Name.StartsWith(p + "."))
                      || formFilePropertyNames.Contains(parameter.Name))
                      parameters.Remove(parameter);
              }
      
              foreach (var formFileParameter in formFileParameterNames)
              {
                  parameters.Add(new NonBodyParameter()
                  {
                      Name = formFileParameter,
                      Type = "file",
                      In = "formData"
                  });
              }
          }
      }
      

      然后在Startup.cs注册这个类

      services.AddSwaggerGen(options =>
          {
              // Swagger Configuration
      
              // Register File Upload Operation Filter
              options.OperationFilter<FormFileSwaggerFilter>();
          });
      

      现在在Service文件中定义如下方法,

      public class ExampleAppService : // Inherit from required class/interface
      {
          public RETURN_TYPE UploadFile([FromForm]IFormFile file)
          {
               // Save file here
          }
      }
      

      *** 上传文件的方法参数中不要忘记使用[FromForm],否则你会在swagger ui中获得六个参数。

      现在,使用NSwag 生成角度服务文件将需要FileParameter 类型的参数。现在在组件中,

      methodName = (file): void => {
          // file is the selected file
          this._service
            .uploadDocument({ data: file, fileName: file.name } as FileParameter)
            .subscribe((res) => {
                // Handle Response
            });
        };
      

      【讨论】:

        【解决方案3】:

        您不能使用应用服务上传图片。

        • 只需创建一个新控制器并上传您的文件。
        • 将您在服务器中生成的唯一文件名返回给客户端。
        • 当用户保存整个实体时,将唯一的文件名再次发送到服务器。

        您可以从 AbpController 派生控制器。

        【讨论】:

        • 这是我遵循的步骤。
        【解决方案4】:

        首先注入IHostingEnvironment获取服务器路径 私有 IHostingEnvironment _environment;

        然后在函数中使用它

        [HttpPost]
            public void PostFile(IFormFile file)
            {
                string uploads = Path.Combine(_environment.WebRootPath, "uploads");            
                
                if (file.Length > 0)
                {
                    var filePath = Path.Combine(uploads, file.FileName);
        
                    using (var fileStream = new FileStream(filePath, FileMode.Create))
                    {
                        file.CopyTo(fileStream);
                    }
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2012-05-11
          • 2011-01-10
          • 2021-03-21
          • 2012-01-20
          • 2020-04-01
          • 2011-06-18
          • 1970-01-01
          • 1970-01-01
          • 2010-09-20
          相关资源
          最近更新 更多