如何在SharePoint 2013托管应用中实现从Azure Blob Storage下载文件
结合你现有技术栈,提供两种可直接落地的实现方案,按需选择即可:
方案一:前端JS直接调用Azure Blob下载(无服务端改动,适配纯JS场景)
无需修改现有WCF服务,纯前端即可完成对接,步骤如下:
- 先在Azure Portal配置Blob容器的CORS规则:允许你的SharePoint站点域名的GET请求,允许请求头配置为
*,暴露响应头新增Content-Disposition,最大缓存时效设为86400 - 生成Blob访问SAS令牌:如果文件访问周期固定可直接在Azure后台生成只读权限、有效期匹配业务需求的固定SAS;如果需要动态管控权限,可在现有WCF服务中新增一个轻量接口,用
Azure.Storage.Blobs包动态生成SAS返回给前端即可 - 前端绑定下载按钮事件逻辑,示例代码如下:
document.querySelector('#downloadBtn').addEventListener('click', async function() { // 拼接Blob地址 + 提前获取的SAS令牌 const blobFullUrl = 'https://<你的存储账户名>.blob.core.chinacloudapi.cn/<容器名>/<目标文件名>?<SAS令牌>'; const res = await fetch(blobFullUrl); const fileBlob = await res.blob(); // 生成临时a标签触发本地下载 const tempLink = document.createElement('a'); tempLink.href = window.URL.createObjectURL(fileBlob); // 替换为业务侧的实际文件名 tempLink.download = '业务文件名.docx'; document.body.appendChild(tempLink); tempLink.click(); // 清理临时资源 document.body.removeChild(tempLink); window.URL.revokeObjectURL(tempLink.href); })
- 注意事项:SAS令牌必须严格控制权限,仅开放只读权限,有效期不要超过业务需要的最长时间,避免泄露后被滥用
方案二:通过现有WCF服务代理下载(安全性更高,适合管控严格的场景)
复用你已有的C# WCF服务做中转,无需向暴露Blob的任何访问权限给前端,安全可控,步骤如下:
- WCF服务端先引入
Azure.Storage.BlobsNuGet包,将Azure存储账户连接字符串配置到WCF的配置文件中 - 新增下载接口,入参为业务侧的文件唯一标识,返回文件流和对应响应头,核心逻辑示例:
[OperationContract] [WebGet(UriTemplate = "DownloadFile?fileId={fileId}")] public Stream DownloadFile(string fileId) { // 第一步:做用户权限校验,确认当前登录的SharePoint用户有权限下载该文件 if (!CheckUserPermission(HttpContext.Current.User.Identity.Name, fileId)) { throw new WebFaultException(HttpStatusCode.Forbidden); } // 第二步:根据fileId从业务库查询对应的Blob容器名、Blob名、业务文件名 var blobBusinessInfo = GetBlobInfoByFileId(fileId); // 第三步:连接Azure Blob获取文件流 var blobClient = new BlobClient(ConfigurationManager.AppSettings["AzureBlobConnStr"], blobBusinessInfo.ContainerName, blobBusinessInfo.BlobName); var downloadResult = blobClient.Download(); // 第四步:设置响应头,触发浏览器下载 HttpContext.Current.Response.ContentType = downloadResult.Value.Details.ContentType; HttpContext.Current.Response.Headers.Add("Content-Disposition", $"attachment; filename={HttpUtility.UrlEncode(blobBusinessInfo.FileName)}"); return downloadResult.Value.Content; }
- 前端直接调用WCF接口触发下载即可,无需额外处理Blob逻辑:
document.querySelector('#downloadBtn').addEventListener('click', function() { const targetFileId = '当前页面对应的业务文件ID'; window.open(`${你的WCF服务根地址}/DownloadFile?fileId=${targetFileId}`, '_blank'); })
- 优势:所有访问控制都在服务端完成,Blob可直接设置为不公开访问,无SAS泄露风险,还可扩展下载日志、流量管控等额外业务逻辑
内容的提问来源于stack exchange,提问作者Anjali
相关产品推荐
相关产品推荐

