【问题标题】:Nativescript: How to create a JS File object from file path?Nativescript:如何从文件路径创建一个 JS File 对象?
【发布时间】:2019-05-09 06:03:13
【问题描述】:

我正在使用 nativescript-imagepicker 插件从手机图库中选择图像。这个插件允许我得到的东西之一是文件的路径。

我需要能够使用表单数据将此选定的文件上传到服务器。为此,我需要先创建一个文件对象。

如何使用文件路径来创建文件对象?

【问题讨论】:

    标签: android nativescript


    【解决方案1】:

    对于从照片库上传图片,我强烈建议使用Nativescsript background http。要将图像上传到服务器,您必须将它们保存在应用程序中,以便上传。我遵循了此处显示的示例Upload example

    将图像保存到本地后,如果您需要更多数据,则需要使用 multipartUpload 并构造一个类似这样的请求。

    let BackgroundHTTP = require('nativescript-background-http')
    let session = BackgroundHTTP.session('some unique session id')
    let request: {
        url: 'your.url.to/upload/images',
        method: 'POST',
        headers: {
            'Content-Type': 'application/octet-stream'
        }
        description: 'Uploading local images to the server'
    }
    
    //photos should have at least the filename from when you saved it locally.
    let params = []
    photos.forEach(photo => {
        params.push({name: photo.name, filename: photo.filename, value: 'ANY STRING DATA YOU NEED'})
    }
    
    let task = session.multipartUpload(params, request)
    
    task.on('progress', evt => {
        console.log('upload progress: ' + ((evt.currentBytes / evt.totalBytes) * 100).toFixed(1) + '%')
    }
    
    task.on('error', evt => {
        console.log('upload error')
        console.log(evt)
    }
    
    task.on('complete', evt => {
        //this does not mean the server had a positive response
        //but the images hit the server.
        // use evt.responseCode to determine the status of request
        console.log('upload complete, status: ' + evt.responseCode)
    }
    
    

    【讨论】:

    • 感谢您的回复。我不得不说我不明白为什么我需要“将图像保存在应用程序中”。我不能像使用普通 HTML 表单一样从图库中的现有文件创建一个 File 对象吗?
    • @sheff2k1 我不确定需要本地副本的原因。我得到了和你一样的文件路径,并且正在努力上传任何东西。经过几天的努力并阅读了与github.com/NativeScript/nativescript-imagepicker/issues/221 类似的问题后,我最终遵循了其他人似乎都这样做的方式。创建本地副本似乎是最好的解决方案。上传完成后,我会删除本地照片以节省空间。
    • 您在选择表单库时可能无法始终访问原始文件,因此如果您希望在应用程序中经常访问它,建议您将其写入文件。此外,您应该使用后台 http 插件,因为默认的 http 客户端不支持分段上传。如果您不希望使用后台 http 插件进行上传,另一种选择是将图像上传为 base64 字符串。
    • 所以我管理(或多或少)使用 session.uploadFile 方法,就像它在标准示例中所示(使用我画廊中存在的文件,没有经过任何特殊的文件复制过程.)。但是,multipartUpload 对我不起作用。 let task = session.multipartUpload(params, request) 不返回任何内容,也没有任何反应。我尝试深入研究代码,似乎它只是在库的一些内部函数调用中“中断”,没有任何错误。您是否真的尝试运行 multipartUpload?怀疑权限是一个问题,因为单个文件有效
    • 我还要补充一点,即使我不使用“params”数组中的任何文件,但只使用一些标准字段,也会发生这种奇怪的事情。
    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2012-05-11
    • 1970-01-01
    • 2019-08-31
    • 2015-11-14
    • 2013-05-24
    相关资源
    最近更新 更多