nativescript后台http问题

nativescript后台http问题,nativescript,nativescript-telerik-ui,Nativescript,Nativescript Telerik Ui,我尝试为我的应用程序实现图像上传页面,但不幸的是,请求没有到达服务器。我在服务器端使用tcpdump对此进行了双重检查。代码似乎无法处理sendImages函数中的session.uploadFile之外的内容 如果代码有任何问题,请告诉我 var imageSource = require("image-source"); var frameModule = require("ui/frame"); var Observable = require("data/observable").Obs

我尝试为我的应用程序实现图像上传页面,但不幸的是,请求没有到达服务器。我在服务器端使用tcpdump对此进行了双重检查。代码似乎无法处理sendImages函数中的session.uploadFile之外的内容

如果代码有任何问题,请告诉我

var imageSource = require("image-source");
var frameModule = require("ui/frame");
var Observable = require("data/observable").Observable;
var fromObject = require("data/observable").fromObject;
var ObservableArray = require("data/observable-array").ObservableArray;
var platformModule = require("platform");

var permissions = require("nativescript-permissions");
var imagepickerModule = require("nativescript-imagepicker");
var bghttpModule = require("nativescript-background-http");
var session = bghttpModule.session("image-upload");

var fs = require("file-system");


var page;
var imageName;
var counter = 0;

function pageLoaded(args) {
    page = args.object;
}


function onSelectSingleTap(args) {
    var context = imagepickerModule.create({
        mode: "single"
    });

    if (platformModule.device.os === "Android" && platformModule.device.sdkVersion >= 23) {
        permissions.requestPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE, "I need these permissions to read from storage")
            .then(function () {
                console.log("Permissions granted!");
                startSelection(context);
            })
            .catch(function () {
                console.log("Uh oh, no permissions - plan B time!");
            });
    } else {
        startSelection(context);
    }
}

function sendImages(uri, fileUri) {

    imageName = extractImageName(fileUri);
    var request = {
        url: "http://maskingIpForPost:8081/mobilepic/ctk/uploadpic",
        method: "POST",
        headers: {
            "Content-Type": "application/octet-stream",
            "file-Name": imageName,
            "uid": 30
        },
        description: "{ 'uploading': " + imageName + " }"
    };

    var task = session.uploadFile(fileUri, request);

    task.on("progress", progress);
    task.on("error", error);
    task.on("complete", complete);
    task.on("responded", responded);
    function responded(e) {
        console.log("eventName: " + e.eventName);
        console.log("data: " + e.data);
    }
    function progress(e) {
        console.log("currentBytes: " + e.currentBytes);
        console.log("totalBytes: " + e.totalBytes);
        console.log("eventName: " + e.eventName);
    }
    function error(e) {
        console.log("eventName: " + e.eventName);
        console.log("eventName: " + e.responseCode);
        console.log("eventName: " + e.response);
    }

    function complete(e) {
        console.log("eventName: " + e.eventName);
        console.log("response: " + e.responseCode);
   }

    return task;
}

function startSelection(context) {

    context
        .authorize()
        .then(function () {

            return context.present();
        })
        .then(function (selection) {
            selection.forEach(function (selected_item) {
                    var localPath = null;

                    if (platformModule.device.os === "Android") {
                        localPath = selected_item._android;
                    } else {
                        // selected_item.ios for iOS is PHAsset and not path - so we are creating own path
                        let folder = fs.knownFolders.documents();
                        let path = fs.path.join(folder.path, "Test" + counter + ".png");
                        //let saved = imagesource.saveToFile(path, "png");

                        localPath = path;
                    }
alert("final path  " + localPath);
                    if (localPath) {
                        var task = sendImages("Image" + counter + ".png", localPath);
                        //mainViewModel.get("items").push(fromObject({ thumb: imagesource, uri: "Image" + counter + ".png", uploadTask: task }));
                    }
                    counter++;
            });
        }).catch(function (e) {
            console.log(e.eventName);
        });
}

function extractImageName(fileUri) {
    var pattern = /[^/]*$/;
    var imageName = fileUri.match(pattern);

    return imageName;
}


exports.pageLoaded = pageLoaded;
exports.onSelectSingleTap = onSelectSingleTap;
进一步研究发现如下


net.gotev.uploadservice.uploadservice在background-http.android.js中未定义。现在我不知道这意味着什么。如果有人对此有所了解,我们将不胜感激。您需要更改代码中的以下行

var session = bghttpModule.session("image-upload");
它必须是文件上传

var session = bghttpModule.session("file-upload");
刚刚使用Azure Blob存储将url放在我这边测试了您的代码,得到了以下响应

ActivityManager: START u0 {act=android.intent.action.OPEN_DOCUMENT typ=image/* cmp=com.android.documentsui/.DocumentsActivity (has extras)} from pid 2835

JS: currentBytes: 4096
JS: totalBytes: 25220
JS: eventName: progress
JS: currentBytes: 25220
JS: totalBytes: 25220
JS: eventName: progress
JS: currentBytes: 25220
JS: totalBytes: 25220
JS: eventName: progress
JS: eventName: responded
JS: data: 
JS: eventName: complete
JS: response: 201

感谢您的快速响应,我尝试在模拟器上运行它,我遇到了上述问题,我通过连接设备尝试了同样的方法,效果很好。

您可以在调试模式下运行并签入chrome devtool通常,这意味着第三方库(Java依赖项)未正确安装。强制nativescript通过Gradle下载依赖项。最简单的解决方案是
rm-rf平台
tns运行android
。您是否使用模拟器或设备进行检查?如果是,版本是什么!您是否在两个平台上都面临这个问题?