Как загрузить файл из Angular 7 в Django - получить ошибку 403 (запрещено) - PullRequest
0 голосов
/ 10 ноября 2018

Я пробовал сейчас так много разных способов, я не могу загрузить файл с Angular 7 в Django Backend - не должно быть так сложно?!

Мой .html :

<div class="form-group">
  <label for="file">Choose File</label>
  <input type="file"
         id="file"
         (change)="handleFileInput($event.target.files)">
</div>

uploader.component.ts

  fileToUpload: File = null;

  handleFileInput(files: FileList) {
    this.fileToUpload = files.item(0);
    this.uploadFileToActivity();
  }

  uploadFileToActivity() {
    this.uploaderService.post(this.fileToUpload).subscribe(data => {
      // do something, if upload success
      }, error => {
        console.log(error);
      });
  }

my uploader.service.ts , который также показывает ход загрузки

public post( fileToUpload: File): Observable<number>{
    const url = '/api/upload/';

    var subject = new Subject<number>()
    const req = new HttpRequest('POST', url, fileToUpload, {
        reportProgress: true,
    });

    this.httpClient.request(req).subscribe(event => {
        if (event.type === HttpEventType.UploadProgress) {
            const percentDone = Math.round(100 * event.loaded / event.total);
            subject.next(percentDone);
          } else if (event instanceof HttpResponse) {
            subject.complete();
          }
    });
    return subject.asObservable();
  }

А в бэкэнде Django:

views.py

def post(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            #handle_uploaded_file(request.FILES['file'])
            return HttpResponseRedirect('/success/url/')
    else:
        form = UploadFileForm()
    return render(request, 'index.html', {'form': form})

forms.py:

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

и urls.py:

urlpatterns = [
    path(r'api/upload/', views.post, name='post'),
]

Когда я запустил это, я получаю

zone.js:2969 POST http://127.0.0.1:8000/api/upload/ 403 (Forbidden)

Нужно ли включать токен авторизации? Если да: как?

Большое спасибо!

РЕДАКТИРОВАТЬ: После полезного ввода от Мартина Урбанека я проверил запрос загрузки файла в браузере. Вот результат:

inspection of upload request from angular to django in browser

Кто-нибудь знает, что мне нужно изменить в моем коде выше, чтобы эта работа работала?

1 Ответ

0 голосов
/ 11 ноября 2018

Content-Type заголовок должен быть multipart/form-data для передачи любых файлов. Я рекомендую вам проверить, отправлен ли этот заголовок на ваш бэкэнд Django.

...