文件名含单引号时,React应用通过API上传文件至SharePoint失败
问题根源
SharePoint的OData URL语法中,单引号是字符串的边界分隔符,当文件名包含单引号时,直接使用encodeURIComponent编码会导致解析错误——因为编码后的%27会被解码回单引号,破坏URL的语法结构。
解决方案
方法一:转义URL中的单引号(适配原调用方式)
按照OData语法要求,将文件名中的单个单引号'替换为两个连续单引号'',再进行URI编码,这样SharePoint解析时会把''识别为字符串内部的一个单引号。
代码示例:
const filename = "File ' name.docx"; // 转义单引号 const escapedFilename = filename.replace(/'/g, "''"); // URI编码 const encodedFilename = encodeURIComponent(escapedFilename); // 拼接API地址 const apiUrl = `${url}/_api/web/lists/getByTitle('ListTitle')/items('1')/AttachmentFiles(FileName='${encodedFilename}')`; // 发起POST请求 .post(apiUrl, /* 请求体及配置 */)
方法二:通过请求体传递文件名(更推荐)
改用AttachmentFiles/add方法,将文件名放在JSON请求体中传递,避免在URL中处理特殊字符,JSON格式对单引号的支持更直接。
代码示例:
const filename = "File ' name.docx"; const apiUrl = `${url}/_api/web/lists/getByTitle('ListTitle')/items('1')/AttachmentFiles/add`; // 构造请求体 const requestBody = JSON.stringify({ '__metadata': { 'type': 'SP.AttachmentFile' }, 'FileName': filename }); // 发起POST请求,注意设置正确的请求头 .post(apiUrl, requestBody, { headers: { 'Content-Type': 'application/json;odata=verbose', // 补充你的授权头、Accept等必要配置 } })
说明
- 不建议使用UTF编码替换单引号,这会改变文件名的实际内容,不符合需求。
- 方法二的兼容性更好,也能避免其他特殊字符(如双引号、空格等)可能引发的URL语法问题。
内容的提问来源于stack exchange,提问作者Alnedru
相关产品推荐
相关产品推荐

