Alfresco更新文件 – 错误发布

我正在尝试更新Alfresco中的文件……我制作了这段代码:

var csrf_header = Alfresco.util.CSRFPolicy.getHeader(); var csrf_token = Alfresco.util.CSRFPolicy.getToken(); function getResponse(pdfbase64) { var fd = new FormData(); if (Alfresco.util.CSRFPolicy && Alfresco.util.CSRFPolicy.isFilterEnabled()) { fd.append(csrf_header, csrf_token); } fd.append("username", "admin"); fd.append("updatenoderef", nodeRef); fd.append("filedata", pdfbase64); fd.append("majorversion", "true"); fd.append("overwrite", "true"); alert(fileUpdateURL); $.ajax({ url: fileUpdateURL, type: "POST", data: fd, processData: false, // tell jQuery not to process the data contentType: false // tell jQuery not to set contentType }); } 

变量pdfbase64是放在文件上的内容(我在文件中对更新base64中的文件所做的更改),但也许这不是正确的格式?, nodeRef是文件的引用,如: "workspace://SpacesStore/4fb1b7e7-2502-4011-8870-17e8d626b93b"fileUpdateURLPOSTURLhttp://localhost:8080/share/proxy/alfresco/api/upload

参数的来源

我收到了错误:

POST http:// localhost:8080 / share / proxy / alfresco / api / upload 500内部服务器错误

javax.servlet.ServletException:比较会话中的令牌和请求参数时可能发生的CSRF攻击。 请求:org.alfresco.web.site.servlet.CSRFFilter.doFilter上的org.alfresco.web.site.servlet.CSRFFilter $ AssertTokenAction.run(CSRFFilter.java:845)上的POST / share / proxy / alfresco / api / upload (CSRFFilter.java:312)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)位于org.alfresco的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)。 web.site.servlet.SSOAuthenticationFilter.doFilter(SSOAuthenticationFilter.java:447)

org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)org.alfresco.web.site.servlet.MTAuthenticationFilter .doFilter(MTAuthenticationFilter.java:74)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)org。 apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase。 java:504)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)atg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)org.apache.catalina.valves org.apa上的.AccessLogValve.invoke(AccessLogValve.java:950) chegatalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor。 java:1074)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:611)atg.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.doRun(AprEndpoint.java:2466)at org.apache java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor) .java:617)atg.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:745)

编辑:如果我使用

HTTP://本地主机:8080 /户外/服务/ API /上传

代替

HTTP://本地主机:8080 /股/代理/户外/ API /上传

我收到错误:

 { "status" : { "code" : 400, "name" : "Bad Request", "description" : "Request sent by the client was syntactically incorrect." }, "message" : "Required parameters are missing", "exception" : "", "callstack" : [ ], "server" : "Community v5.0.0 (d r99759-b2) schema 8,022", "time" : "Jan 24, 2016 1:14:41 PM" } 

谁能帮我?

EDIT2:

我尝试使用http:// localhost:8080 / share / proxy / alfresco / api / upload发出请求:

 function getResponse(pdfbase64) { var csrf_header = Alfresco.util.CSRFPolicy.getHeader(); var csrf_token = Alfresco.util.CSRFPolicy.getToken(); var fd = new FormData(); if (Alfresco.util.CSRFPolicy && Alfresco.util.CSRFPolicy.isFilterEnabled()) { fd.append(csrf_header, csrf_token); fileUpdateURL += "?" + Alfresco.util.CSRFPolicy.getParameter() + "=" + encodeURIComponent(Alfresco.util.CSRFPolicy.getToken()); } fd.append("username", "admin"); fd.append("updatenoderef", nodeRef); fd.append("filedata", pdfbase64); fd.append("majorversion", "true"); fd.append("overwrite", "true"); alert(fileUpdateURL); $.ajax({ url: fileUpdateURL, type: "POST", data: fd, processData: false, // tell jQuery not to process the data contentType: false // tell jQuery not to set contentType }); } 

但是我得到了错误:

 { "status" : { "code" : 400, "name" : "Bad Request", "description" : "Request sent by the client was syntactically incorrect." }, "message" : "Required parameters are missing", "exception" : "", "callstack" : [ ], "server" : "Community v5.0.0 (d r99759-b2) schema 8,022", "time" : "Jan 24, 2016 1:14:41 PM" } 

尝试在函数中移动这些行:

 var csrf_header = Alfresco.util.CSRFPolicy.getHeader(); var csrf_token = Alfresco.util.CSRFPolicy.getToken(); 

如果这不能解决您的问题并且问题结果不是csrf_* vars的可变范围问题,那么您应该从这里尝试提示(2)


更新:正如我在聊天中解释的那样,您应该更换:

 fd.append("filedata", pdfbase64); 

用:

 fd.append("filedata", new Blob([pdfbase64], {type: 'application/pdf'});); 

不是设置标头,而是在url上传递令牌:

 if (Alfresco.util.CSRFPolicy && Alfresco.util.CSRFPolicy.isFilterEnabled()) { url += "?" + Alfresco.util.CSRFPolicy.getParameter() + "=" + encodeURIComponent(Alfresco.util.CSRFPolicy.getToken()); } 

如CSRF政策中所述

通过提交带有enctype multipart / form-data的表单上传文件时,无法在请求上设置标头,原因不是因为具体的enctype,而是因为它无法设置标头在浏览器中提交任何表单。

另一个解决方案是使用Alfresco.forms.Form来处理所有事情。