尝试为SharePoint列表添加附件时遭遇403 Forbidden错误求助
你遇到的403禁止错误,主要是API请求的语法问题加上SharePoint的特殊验证要求导致的,我帮你梳理下修复方案:
先看你的原HTML代码:
<html> <input id="uploadFile" type="file"> <input type="button" onclick="AddAttachments(1)" value="Add Attachments"> </html>
报错的请求URL里藏着一个明显的语法问题:
POST http://siteurl/_api/web/lists/getbytitle ('DocUploadTest')/items(1)/AttachmentFiles/add(FileName='Test.txt') 403 (FORBIDDEN)
关键问题分析&修复点
API URL语法错误
你写的getbytitle ('DocUploadTest')多了一个空格!OData路径要求getbytitle和括号之间不能有空格,正确写法是getbytitle('DocUploadTest')。这个语法错误会导致SharePoint无法解析API路径,直接返回类似权限禁止的错误。缺少X-RequestDigest验证头
SharePoint的所有POST/PUT/DELETE请求都必须携带X-RequestDigest头来防止CSRF攻击,没有这个头的话,服务器会直接返回403。你需要先从/_api/contextinfo接口获取这个验证值,再用它发起上传请求。文件数据传递方式不对
上传文件必须用FormData封装,同时要告诉jQuery不要自动处理数据格式,否则会导致文件内容被错误编码,服务器无法识别。
修正后的完整代码
<html> <input id="uploadFile" type="file"> <input type="button" onclick="AddAttachments(1)" value="Add Attachments"> <script src="http://siteName/SiteAssets/ScriptFiles/jquery.min.js"></script> <script> function AddAttachments(itemId) { // 先检查是否选择了文件 var fileInput = document.getElementById('uploadFile'); var selectedFile = fileInput.files[0]; if (!selectedFile) { alert('请先选择要上传的文件哦'); return; } // 获取SharePoint的RequestDigest验证值 $.ajax({ url: _spPageContextInfo.webAbsoluteUrl + "/_api/contextinfo", method: "POST", headers: { "Accept": "application/json; odata=verbose" }, success: function(contextData) { var requestDigest = contextData.d.GetContextWebInformation.FormDigestValue; // 拿到验证值后发起上传请求 uploadFileToAttachment(requestDigest, itemId, selectedFile); }, error: function(err) { console.log('获取验证信息失败:', err); } }); } function uploadFileToAttachment(digest, itemId, file) { // 修正后的API URL,去掉了getbytitle后面的空格 var apiEndpoint = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('DocUploadTest')/items(" + itemId + ")/AttachmentFiles/add(FileName='" + file.name + "')"; // 用FormData封装文件 var formData = new FormData(); formData.append('file', file); $.ajax({ url: apiEndpoint, method: "POST", headers: { "Accept": "application/json; odata=verbose", "X-RequestDigest": digest // 必须携带的验证头 }, processData: false, // 禁止jQuery处理FormData contentType: false, // 让浏览器自动设置正确的Content-Type data: formData, success: function(response) { alert('附件上传成功啦!'); console.log('上传详情:', response); }, error: function(xhr, status, err) { console.log('上传失败:', xhr.responseText); } }); } </script> </html>
额外注意事项
- 权限检查:确保当前登录用户对
DocUploadTest列表有编辑列表项和添加附件的权限,如果权限不足,即使代码正确也会返回403。 - _spPageContextInfo可用性:这段代码依赖SharePoint页面自带的
_spPageContextInfo对象,如果是在独立HTML页面使用,可能需要手动传入站点URL,或者确保页面在SharePoint环境中加载。
内容的提问来源于stack exchange,提问作者saumya bhargava
相关产品推荐
相关产品推荐

