很多时候大家都需要用到在线文档编辑服务之类的东西,今天就以WPS的在线编辑为例。【目前仅支持以企业形式申请】
链接WPS开放平台。
效果图如下
用到示例https://github.com/guolaopi/WPSOnlineDemo
改过之后的后台代码示例:
[Route("api/[controller]/[Action]")]
[ApiController]
public class WpsController : ControllerBase
{
private ILogger _logger;
private SessionManager _sessionManager;
private IWebHostEnvironment _webHostEnvironment;
private readonly UserService _userService;
public WpsController(ILogger<WpsController> logger, SessionManager sessionManager, IWebHostEnvironment webHostEnvironment, UserService userService)
{
_logger = logger;
_sessionManager = sessionManager;
_webHostEnvironment = webHostEnvironment;
_userService = userService;
}
/// <summary>
/// 简单过滤一下HttpRequest参数
/// </summary>
/// <param name="Request"></param>
/// <returns></returns>
private RequestParam FilterRequestForWPS(HttpRequest Request)
{
var result = new RequestParam();
result.FileId = Request.Headers["x-weboffice-file-id"].ToString();
var queryStr = Request.QueryString.ToString();
queryStr = queryStr.StartsWith("?") ? queryStr.Substring(1) : queryStr;
if (string.IsNullOrEmpty(queryStr) || string.IsNullOrEmpty(result.FileId))
{
return new RequestParam
{
code = 403,
msg = "参数错误,无法打开文件",
Status = false
};
}
// url参数序列化成Dictionary
result.Params = queryStr.Split("&", StringSplitOptions.RemoveEmptyEntries).ToDictionary(p => p.Split("=")[0], p => p.Split("=")[1]);
// 此处判断是否传递了自定义的 _w_userId 参数,如果不需要此参数的话可以注释该判断
if (!result.Params.ContainsKey("_w_userId"))
{
return new RequestParam
{
code = 403,
msg = "用户异常",
Status = false
};
}
return result;
}
/// <summary>
/// 生成iframe用的url(此方法非WPS官方的,主要是为了签名,也可以自己实现)
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("/api/wps/genarate")]
[HttpPost]
[Authorize]
[RoleAuthorize]
public Task<GenarateResult> GenarateWPSUrl(GenarateRequest request)
{
try
{
//请求文件是否存在
if (string.IsNullOrEmpty(request.FileName) || !System.IO.File.Exists($"{_webHostEnvironment.WebRootPath}/{request.FilePath}/{request.FileName}"))
return Task.Run(() =>
{
return new GenarateResult { Url = null };
});
else
{
return Task.Run(() =>
{
var url = WPSSignatureHelper.GenarateUrl(request.FileId,
request.FileType,
new Dictionary<string, string> {
{ "_w_userId", _sessionManager.CurrUser.Id.ToString() },
{ "_w_fileName", request.FileName },
{ "_w_readOnly", request.ReadOnly },
{ "_w_filePath", request.FilePath }
});
// 上面的写法是在生成的url中带了两个自定义参数 _w_userId 和 _w_fileName,可以根据业务自己扩展,生成url是这样的:
// https://wwo.wps.cn/office/w/123?_w_appid=123456&_w_fileName=x.docx&_w_userId=5024&_w_signature=xxxxx
_logger.LogInformation($"生成URL:{url}");
// 也可以不写自定义参数,这样生成的url会只有 _w_appId 和