【问题标题】:Nativescript Background Http request Error Code 400Nativescript 后台 Http 请求错误代码 400
【发布时间】:2021-04-20 21:50:47
【问题描述】:

我正在尝试将图像文件上传到我的后端。但是,无论设备(Android 或 IOS)如何,我都会收到 400 错误代码。不知道我做错了什么,但我按照@nativescript/background-http 上的文档上传文件

  • Nativescript 版本:7
  • 角度版本:10
  • Android 和 IOS 均存在问题

控制台日志:

        
    shared.service.ts:48 File exists: true
    shared.service.ts:54 photo Saved: true
        
    Photo File: {
       "_path": "/data/user/0/org.nativescript.WorkoutTracker/files/Stone0.png",
       "_name": "Stone0.png",
       "_extension": ".png"
    }
        
    shared.service.ts:164 upload progress: 0.1%
    shared.service.ts:164 upload progress: 100.0%
    profile.component.ts:83 
    Server error: {
          "eventName": "error",
          "object": {
            "_observers": {
              "progress": [
                {}
              ],
              "error": [
                {}
              ],
              "complete": [
                {}
              ]
            },
            "_session": {
              "_id": "img_upload"
            },
            "_id": "img_upload{1}",
            "_description": "Uploading",
            "_upload": 120143,
            "_totalUpload": 120143,
            "_status": "error"
          },
          "error": null,
          "responseCode": 400,
          "response": {}
        }
    
    

这是代码:

imageUpload(photo: File, token: string) {
        let observer: Subscriber<Image>;
        const imageUpload$ = new Observable<Image>(
            (observ) => (observer = observ)
        );

        const imgUrl = apiDomain + images;

        console.log("Filee exists:", File.exists(photo.path));
        const params = [];
        const param = {
            name: "photo",
            filename: photo.path,
            mimeType: "image/jpeg",
        };
        params.push(param);

        const headers = {
            // "Content-Type": "application/protobuf",
            'Authorization': `Bearer ${token}`,
            "Content-Type": "application/octet-stream",
            // 'Accept': 'application/protobuf',
            // "File-Name": photo.name
        };

        // const headers = new HttpHeaders({
        //     Authorization: "Bearer " + token,
        //     // 'Accept': 'application/protobuf',
        //     "Content-Type": "application/protobuf",
        //     // "Content-Type": "application/octet-stream",
        // });
        // console.log("Content-Type:", headers);

        this.fileUpload<Image>(imgUrl, { requestType: "POST", headers }, params).subscribe(
            (res) => {
                if (res instanceof Image) {
                    observer.next(res);
                }
            },
            (err) => {
                observer.error(err);
            }
        );

        return imageUpload$;
    }
fileUpload<E>(uri: string, body: { requestType?: "POST" | "GET", headers}, params: any[]) {
        let observer: Subscriber<E | ProgressEventData | ResultEventData>;
        const request$ = new Observable<E | ProgressEventData | ResultEventData>((observ) =>(observer = observ));

        const reqSession = session("file-upload");

        const request = {
            url: uri,
            method: body.requestType ?? "POST",
            description: "Uploading",
            headers: body.headers,
        };

        console.log("request", request);
        console.log("params", params);

        const task = reqSession.multipartUpload(params, request);

        task.on("progress", (evt) => {
            console.log(
                "upload progress: " +
                    ((evt.currentBytes / evt.totalBytes) * 100).toFixed(1) +
                    "%"
            );
            observer.next(evt);
        });

        task.on("error", (evt) => {
            console.log("upload error");
            observer.error(evt);
        });

        task.on("complete", (evt) => {
            const event: any = evt;

            if (global.isIOS) {
                if (event.responseCode >= 200 && event.responseCode < 300) {
                    console.log("success", event);
                    const object: E = event.object;
                    observer.next(object);
                    observer.complete();
                } else if (
                    event.responseCode >= 400 &&
                    event.responseCode < 500
                ) {
                    const errorResp: ErrorEventData = event;
                    observer.error(errorResp);
                }
            } else if (global.isAndroid) {
                console.log("success", event.responseCode, event);
                const object: E = event.object;
                observer.next(object);
                observer.complete();
            }
        });

        return request$;
    }

【问题讨论】:

    标签: android ios nativescript nativescript-angular nativescript-plugin


    【解决方案1】:

    400 错误是由于我的参数中的名称

    const param = {
                name: "photo", // This needed to match the name in the backend
                filename: photo.path,
                mimeType: "image/jpeg",
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 2017-07-21
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多