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
相关产品推荐
相关产品推荐

