Liferay 6.2.4 GA5调用JSON API上传文件报错:无对应Web服务动作
解决Liferay 6.2.4 GA5 JSON API上传文档的路径错误问题
首先咱们拆解你遇到的问题:No JSON web service action associated with path /dlapp/add-file-entry这个错误,核心原因是你用错了Liferay 6.2版本对应的JSON API路径,再加上代码里还有几个小细节问题,导致上传失败。下面一步步帮你修复:
问题根源分析
- API路径错误:Liferay 6.2.4中,负责添加文件条目的JSON Web Service并不在
/dlapp/路径下,正确的路径是/dlfileentry/add-file-entry(对应后台的DLFileEntryService.addFileEntry方法)。 - 表单对象选择错误:你代码里的
$(this)[0]指向的是点击的按钮,不是表单本身,这会导致FormData无法正确读取文件和表单数据。 - 缺少CSRF验证:Liferay 6.2默认开启了CSRF保护,POST请求必须携带有效的
authToken才能通过权限校验。 - 参数传递不规范:把非文件参数直接拼在URL里,容易出现参数解析异常,建议统一放到FormData中传递。
修复后的完整代码
<html> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script> $( document ).ready(function() { $("#submit").click(function(e) { e.preventDefault(); // 从Liferay的全局变量获取CSRF Token var authToken = Liferay.authToken; // 正确获取表单对象来构建FormData var formData = new FormData($("#uploadForm")[0]); // 把所有必要参数添加到FormData中 formData.append('repositoryId', '27058'); formData.append('folderId', '34530'); formData.append('sourceFileName', 'Screenshot'); formData.append('mimeType', 'image/png'); formData.append('title', 'hello'); formData.append('description', 'test'); formData.append('changeLog', 'not'); // 加入CSRF Token formData.append('authToken', authToken); $.ajax({ url: 'http://localhost:8080/api/jsonws/dlfileentry/add-file-entry', type: 'POST', data: formData, async: false, cache: false, contentType: false, enctype: 'multipart/form-data', processData: false, success: function (response) { alert('文件上传成功!'); console.log(response); }, error: function(xhr, status, error) { alert('上传失败:' + error); console.log(xhr.responseText); } }); }); }); </script> <!-- 给表单添加ID,方便正确获取 --> <form id="uploadForm"> <input type="file" name="file"/> <input type="button" value="submit" id="submit"/> </form> </html>
额外注意事项
- 权限验证:确保当前登录用户拥有目标文件夹的「添加文档」权限,否则会返回权限错误。
- ID正确性:确认
repositoryId和folderId是正确的,你可以在Liferay控制面板的文档库中,通过查看文件夹的URL来获取这些ID。 - 跨域问题:如果你的页面和Liferay不在同一个域名下,需要在Liferay的
portal-ext.properties中配置CORS允许跨域请求,比如添加:# 简单配置(适合测试环境) jsonws.web.service.public.methods=* portal.security.csrf.enabled=false # 更安全的生产环境配置示例 cors.enabled=true cors.allowed.origins=http://your-frontend-domain.com cors.allowed.methods=GET,POST,PUT,DELETE
内容的提问来源于stack exchange,提问作者Jiten Shahi
相关产品推荐
相关产品推荐

