Загрузка изображений / файлов из Angular 7 в ядро ​​.net - PullRequest
0 голосов
/ 04 апреля 2019

Я изо всех сил пытался загрузить изображения (и затем файлы Excel) на свой внутренний сервер из моего приложения angular 7. Я перепробовал так много вариантов, и НИЧЕГО, кажется, не работает для меня, я не знаю, что мне здесь не хватает.

Последнее, что я попробовал, было из этого примера (https://code -maze.com / upload-files-dot-net-core-angular / ):

это startup.cs:

 // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAutoMapper(x => x.AddProfile(new MappingsProfile()));
        //uzregistruojam konteksto klase
        services.AddDbContext<museumContext>(options =>
        options.UseSqlServer(_configuration.GetConnectionString("MuseumDatabase")));

        // configure strongly typed settings objects
        var appSettingsSection = Configuration.GetSection("AppSettings");
        services.Configure<AppSettings>(appSettingsSection);

        // configure jwt authentication
        var appSettings = appSettingsSection.Get<AppSettings>();
        var key = Encoding.ASCII.GetBytes(appSettings.Secret);
        services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(x =>
        {
            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = false,
                ValidateAudience = false
            };
        });
        services.AddScoped<IUsersRepository, UsersRepository>();
        services.AddScoped<IUsersService, UsersService>();

        services.AddScoped<IClassesRepository, ClassesRepository>();
        services.AddScoped<IClassesService, ClassesService>();

        services.AddCors();
        services.AddMvc();


        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseCors(builder =>
            builder.WithOrigins("http://localhost:4200")
       .AllowAnyHeader()
       .AllowAnyMethod()
       .AllowCredentials());
        app.UseAuthentication();

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseStaticFiles(new StaticFileOptions()
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"Resources")),
            RequestPath = new PathString("/Resources")
        });
        app.UseMvc();
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
        });
    }

Контроллер:

   [Authorize]
[Route("api/[controller]")]
public class ChronicleController : Controller
{
    private readonly IChroniclesService _service;
    private IHostingEnvironment _hostingEnvironment;

    public ChronicleController(IChroniclesService service, IHostingEnvironment hostingEnvironment)
    {
        _service = service;
        _hostingEnvironment = hostingEnvironment;
    }

    [HttpPost, DisableRequestSizeLimit]
    [AllowAnonymous]
    public IActionResult Upload()
    {
        try
        {
            var file = Request.Form.Files[0];
            var folderName = Path.Combine("Resources", "Images");
            var pathToSave = Path.Combine(Directory.GetCurrentDirectory(), folderName);

            if (file.Length > 0)
            {
                var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
                var fullPath = Path.Combine(pathToSave, fileName);
                var dbPath = Path.Combine(folderName, fileName);

                using (var stream = new FileStream(fullPath, FileMode.Create))
                {
                    file.CopyTo(stream);
                }

                return Ok(new { dbPath });
            }
            else
            {
                return BadRequest();
            }
        }
        catch (Exception ex)
        {
            return StatusCode(500, "Internal server error");
        }
    }

интерфейс:

public uploadFile = (files) => {
if (files.length === 0) {
  return;
}

const fileToUpload =  files[0] as File;
const formData = new FormData();
formData.append('file', fileToUpload, fileToUpload.name);

this.httpClient.post('https://localhost:44328/api/chronicle', formData, {reportProgress: true, observe: 'events'})
  .subscribe(event => {
    if (event.type === HttpEventType.UploadProgress) {
      this.progress = Math.round(100 * event.loaded / event.total);
    } else if (event.type === HttpEventType.Response) {
      this.message = 'Upload success.';
      this.uploadFinished.emit(event.body);
    }
  });

}

Я также пробовал: интерфейс:

public uploadFile(data: any, url: string): Observable<any> {
    return this.httpClient.post<any>(this.url + 'chronicle', data);
}

бэкенд:

 [HttpPost, DisableRequestSizeLimit]
    [AllowAnonymous]
    public ActionResult UploadFile([FromForm(Name = "file")] IFormFile file)
    {
        if (file.Length == 0)
            return BadRequest();
        else
        {
        }

        return Ok();
    }

дело в том, я думаю, что если я удалю constructor with service (который затем вызывает хранилище), это будет работать, но это не вариант. Что я здесь не так делаю? Все, что я получаю, это 500 ошибок и Access to XMLHttpRequest at 'https://localhost:44328/api/chronicle' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Добавьте это в свой startup.cs и установите флажок

services.AddCors(options => options.AddPolicy("AllowAll",
            builder =>
            {
                builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod();
            }));

В файле startup.cs настройте

app.UseCors("AllowAll");

В ваших службах

upload(formData) {
        return this.http.request('https://localhost:44328/api/chronicle', formData, {reportProgress: true, observe: 'events'});
    }
0 голосов
/ 04 апреля 2019

В Startup.cs добавить в ConfigureServices:

services.AddCors();

Вкл. Настройка добавить

app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...