Uploading image in ASP.NET Boilerplate

血红的双手。 提交于 2019-12-07 18:46:04

问题


When posting an image, HttpContext.Current.Request is null.

Is there any simple way to achieve this? I am using dropzone.js on client side.

Project is Angular with Web API (ASP.NET Core 2.0) template.

[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;
}

回答1:


This is the code which i had done it is working fine.

public void PostFile(IFormFile file)
{          
    var uploads = Path.Combine(_hostingEnvironment.WebRootPath, "uploads");

    if (file.Length > 0)
    {
        var filePath = Path.Combine(uploads, file.FileName);

        using (var fileStream = new FileStream(filePath, FileMode.Create))
        {
            file.CopyToAsync(fileStream);
        }
    }
}



回答2:


First of all we need to enable File Upload in Swagger using IOperationFilter. Create a class which inherits from IOperationFilter. For detail read 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"
            });
        }
    }
}

Then Register this class in Startup.cs

services.AddSwaggerGen(options =>
    {
        // Swagger Configuration

        // Register File Upload Operation Filter
        options.OperationFilter<FormFileSwaggerFilter>();
    });

Now Define a method as below in Service file,

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

*** Don't forget to use [FromForm] in method parameter for uploading file, else you will get six more params in swagger ui.

Now, Generating Service file of angular using NSwag will require a parameter of type FileParameter. Now in component,

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



回答3:


You cannot use app service for uploading image.

  • Just create a new controller and upload your file.
  • Return to client the unique filename that you generated in server.
  • When user saves the whole entity, send the unique filename to server again.

You can derive your controller from AbpController.

  • https://aspnetboilerplate.com/Pages/Documents/AspNet-Core?searchKey=AbpController
  • https://aspnetboilerplate.com/Pages/Documents/MVC-Controllers?searchKey=AbpController


来源:https://stackoverflow.com/questions/47259324/uploading-image-in-asp-net-boilerplate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!