Угловая загрузка по основной ошибке Asp.net: System.Text.DecoderFallbackException: невозможно преобразовать байты [FF] в индексе - PullRequest
0 голосов
/ 06 июля 2019

Я хочу загрузить файл с Angular 7 и Asp.net core 2.2
. В веб-сервис Angular добавьте файл и добавьте свойство Name
При вызове WebSerice от Angular показывать эту ошибку в основном журнале Asp.net.
Я прочитал этот вопрос и добавил utf-8 в Content-Type, но снова показываю ошибку.
Как я могу решить это? Проблема в Content-Type?

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware:Error: An unhandled exception has occurred while executing the request.

System.Text.DecoderFallbackException: Unable to translate bytes [FF] at index 144 from specified code page to Unicode.
   at System.Text.DecoderExceptionFallbackBuffer.Throw(Byte[] bytesUnknown, Int32 index)
   at System.Text.DecoderExceptionFallbackBuffer.Fallback(Byte[] bytesUnknown, Int32 index)
   at System.Text.DecoderFallbackBuffer.InternalFallback(Byte[] bytes, Byte* pBytes, Char*& chars)
   at System.Text.UTF8Encoding.FallbackInvalidByteSequence(Byte*& pSrc, Int32 ch, DecoderFallbackBuffer fallback, Char*& pTarget)

Asp.net Core:

[HttpPost("[action]")]
[AllowAnonymous]
public async Task<ReturnFromSpDto> AddFileInsertAsync(Test1 name)
{ .. }     

Test1 класс:

public class Test1
{
    public string Name { get; set; }
}

Угловой HTML:

<input #file type="file" multiple (change)="upload(file.files)" />

Угловой:

  upload(files) {
    if (files.length === 0)
      return;
    const formData = new FormData();

    formData.append(files[0].name, files[0]);

    const headers = new HttpHeaders({ "Content-Type": "application/json; charset=utf-8" });
    headers.append('Accept', 'application/json');
    formData.append('Name', 'ads');
    console.log('formData', formData);

    const uploadReq = new HttpRequest('POST',
      `${this.appConfig.apiEndpoint}/api/doc/AddFileInsertAsync`, formData, {
        headers: headers,
        reportProgress: true,
      });

    this.httpClient.request(uploadReq).subscribe(event => {
      if (event.type === HttpEventType.UploadProgress)
        this.progress = Math.round(100 * event.loaded / event.total);
      else if (event.type === HttpEventType.Response)
        this.message = event.body.toString();
    });
  }

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Попробуйте удалить заголовки напрямую и используйте приведенный ниже код для отправки пост-запроса

upload(files) {
  if (files.length === 0)
  return;
  const formData: FormData = new FormData();
  formData.append('name', 'ads');
  formData.append('file', files[0], files[0].name);
  this.httpClient.post( `${this.appConfig.apiEndpoint}/api/doc/AddFileInsertAsync`, formData).subscribe(result => {
    console.log(result);
  }, error => console.error(error));
}

Модель:

public class Test1
{
    public string Name { get; set; }
    public IFormFile File { get; set; }      
}

Действие:

[HttpPost("[action]")]
[AllowAnonymous]
public async Task<ReturnFromSpDto> AddFileInsertAsync([FromForm]Test1 test)
{ .. } 
0 голосов
/ 07 июля 2019

при добавлении файла в formData используйте:

formData.append('file', file, file.name);

Вы используете ваше имя файла в качестве имени поля формы, что может вызвать проблемы, Второй. Не устанавливайте Content-Type на application/json, оставьте его x-www-form-urlencoded.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...