Как загрузить файл из angular в c# бэкэнд (nswag) - PullRequest
0 голосов
/ 30 апреля 2020

Я немного застрял здесь, и мне явно нужна помощь.

Это мой c# бэкэнд:

public async Task<IActionResult> AddAttachmentAsync(IFormFile formFile, int id)
{
    // Stuff is going on...
}

Это отлично работает в интерфейсе Swagger, но когда я генерирую машинописный клиент с nswag, я получаю следующее:

     /**
     * @param minutesId (optional) 
     * @param body (optional) 
     * @return Success
     */
    addAttachment(id: number | undefined, body: Blob | undefined): Observable<string> {
        let url_ = this.baseUrl + "/api/services/app/Attachment/AddAttachment?";
        if (id === null)
            throw new Error("The parameter 'id' cannot be null.");
        else if (id !== undefined)
            url_ += "id=" + encodeURIComponent("" + id) + "&"; 
        url_ = url_.replace(/[?&]$/, "");

        const content_ = body;

        let options_ : any = {
            body: content_,
            observe: "response",
            responseType: "blob",           
            headers: new HttpHeaders({
                "Content-Type": "multipart/form-data", 
                "Accept": "text/plain"
            })
        };

        return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => {
            return this.processAddAttachment(response_);
        })).pipe(_observableCatch((response_: any) => {
            if (response_ instanceof HttpResponseBase) {
                try {
                    return this.processAddAttachment(<any>response_);
                } catch (e) {
                    return <Observable<string>><any>_observableThrow(e);
                }
            } else
                return <Observable<string>><any>_observableThrow(response_);
        }));
    }

IFormFile становится BLOB-объектом, и я пытался создать BLOB-объект несколькими способами, но при попадании в бэкэнд параметр formFile имеет значение null.

Может кто-нибудь подсказать мне, как это сделать?

ОБНОВЛЕНИЕ:

Я обнаружил, что это может быть связано с тем, что nswag генерирует клиента или меня, используя неправильные декораторы.

Если я редактирую свои автоматически созданные сервисные прокси .ts файл к этому:

    addAttachment(id: number | undefined, body: **FormData** | undefined): Observable<string> {
        let url_ = this.baseUrl + "/api/services/app/Attachment/AddAttachment?";
        if (id === null)
            throw new Error("The parameter 'id' cannot be null.");
        else if (id !== undefined)
            url_ += "id=" + encodeURIComponent("" + id) + "&"; 
        url_ = url_.replace(/[?&]$/, "");

        const content_ = body;

        let options_ : any = {
            body: content_,
            observe: "response",
            responseType: "blob",           
            headers: new HttpHeaders({
                 **// Removed "Content-Type": "multipart/form-data",** 
                "Accept": "text/plain"
            })
        };

Затем я вызвал метод следующим образом:

    myUploader(event): void {
        for (let i = 0; i < event.files.length; i++) {

            var formData = new FormData();
            formData.append('formFile', event.files[i], event.files[i].name);

            this._attachmentService.addAttachment(this.id, formData).subscribe(result => {
                console.log(result);
            })
        }
    }

NOTE , что я изменил тип Blob на FormData в сервисе прокси-файл и удалил Content-Header, а также. Также обратите внимание, что в formData.Append я назвал свойство так же, как свойство на стороне c#. если это не сделано, это не работает.

Не думаю, что это правильное решение, потому что мне пришлось вручную редактировать файл services-proxies, то есть я должен делать это каждый раз, когда запускаю refre sh .bat в nswag.

Я пытался реализовать класс OperationFilter, потому что это работало для меня в более ранней версии Swagger (до 5.0.0-rc4), однако мне не удалось заставить его работать с новейшей версией Swagger.

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

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