You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NativeScript File.readSync()遇含空格文件名无法正常工作问题

问题描述

我用NativeScript Angular开发iOS应用,功能是选择文件并转成base64格式发送到服务器。无空格的文件名处理正常,但文件名含空格(比如myFile 1)时,文件路径会被解析成myFile%201,推测这导致File.readSync()无法正常工作。

相关代码
const files = await openFilePicker({
            multipleSelection:true,
            // extensions:['application/pdf','application/msword','application/vnd.openxmlformats-officedocument.wordprocessingml.document','png','jpeg']
            // extensions:['application/pdf','application/msword','application/vnd.openxmlformats-officedocument.wordprocessingml.document']
            // extensions:[]
            
        })

        for(let result of files['files'])
        {
            // extra line to see console easily/
            console.log("");
            console.log("result is : ",result)
            let selectedFile:File;
            
            if(isAndroid)
            {
                selectedFile = File.fromPath(result);
                
            }
            else
            {
                selectedFile = File.fromPath(result.replace("file://",""));
            }

            console.log("");
            console.log("selected File : ", selectedFile)

            if(this.isExtensionAllowed(selectedFile['_extension']))
            {
                if(this.maxAttachmentCount <= 0)
                {
                    this.maxAttachmentCount=0;
                }
                else
                {
                    this.maxAttachmentCount--;
                }

                let data = selectedFile.readSync();
    
                console.log("")
                console.log("data is : ",data)
                let base64File = "";
                if(isIOS)
                {
                    base64File = data.base64EncodedStringWithOptions(0);
                }
                else
                {
                    base64File =  android.util.Base64.encodeToString(data,android.util.Base64.NO_WRAP);
                }

                
                console.log("");
                console.log("base64 is  : ", base64File)
                let attachmentInfo = {name:selectedFile['_name'],extension:'.'+selectedFile['_extension'],
                                base64:base64File};

                if(this.base64Attachments.length == 4)
                {
                    this.base64Attachments.shift();
                }

                (<any[]>this.base64Attachments).push(attachmentInfo);
            }

        }
现象截图
  • 无空格文件名正常工作:
    无空格文件名正常工作截图
  • 含空格文件名无法工作:
    含空格文件名无法工作截图
解决方案

问题出在iOS路径处理环节——从文件选择器返回的路径是URL编码格式(空格被转成%20),但File.fromPath需要的是原始的文件路径字符串,所以需要先对路径进行URL解码。

修改iOS分支的路径处理代码:

else
{
    // 先移除file://前缀,再解码URL编码的路径
    const decodedPath = decodeURIComponent(result.replace("file://",""));
    selectedFile = File.fromPath(decodedPath);
}

decodeURIComponent()会把%20还原成空格,让File.fromPath能正确识别带空格的文件路径,后续readSync()即可正常读取文件内容。

验证

修改后重新测试带空格的文件名,确认selectedFile的路径显示为原始带空格的名称,readSync()返回正确的文件数据,base64转换流程正常完成。

内容的提问来源于stack exchange,提问作者Muhammad Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:40:55