VisualForce页面中的Javascript-表单提交成功,触发顶点?
现在,下面的代码在提交时,首先插入一个文件,然后提交表单。这是有问题的-我需要它验证表单是否已成功发布到AmazonS3,然后插入(令牌)文件,以便它可以链接到它 我基本上需要反转SubmitFile和InsertFile,但我不确定如何反转(如果表单成功发送,则运行另一个javascript函数)。看到底部的尝试…这可能吗VisualForce页面中的Javascript-表单提交成功,触发顶点?,javascript,salesforce,apex-code,visualforce,Javascript,Salesforce,Apex Code,Visualforce,现在,下面的代码在提交时,首先插入一个文件,然后提交表单。这是有问题的-我需要它验证表单是否已成功发布到AmazonS3,然后插入(令牌)文件,以便它可以链接到它 我基本上需要反转SubmitFile和InsertFile,但我不确定如何反转(如果表单成功发送,则运行另一个javascript函数)。看到底部的尝试…这可能吗 <apex:pageMessages id="pageErrors"></apex:pageMessages> <form name="
<apex:pageMessages id="pageErrors"></apex:pageMessages>
<form name="s3Form" action="https://s3.amazonaws.com/mybucket" method="post" enctype="multipart/form-data">
<input type="hidden" name="key"/>
<input type="hidden" name="AWSAccessKeyId" value="{!key}"/>
<input type="hidden" name="policy" value="{!policy}"/>
<input type="hidden" name="signature" value="{!signedPolicy}"/>
<input type="hidden" name="acl" value="private"/>
<input type="hidden" name="x-amz-meta-FileId" value="{!File__c.id}"/>
<input type="hidden" name="x-amz-meta-OrderId" value="{!OrderId}"/>
<input type="hidden" name="x-amz-meta-CustomerId" value="{!CustomerId}"/>
<input type="hidden" name="success_action_redirect" value="{!serverUrl}{!OrderId}"/>
<apex:pageBlock title="New File Upload" mode="maindetail" tabStyle="File__c"> <!-- rendered="{!open}"-->
<apex:pageBlockSection title="File Information" columns="2" collapsible="false" showHeader="false">
<apex:pageBlockSectionItem >
<apex:outputLabel value="Select File" for="selectFile"/>
<input id="selectedFile" type="file" size="25" name="file" onChange="setFileName(this.value)"/>
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
<apex:pageBlockButtons location="bottom">
<input class="btn" type="button" value="Upload File" onClick="checkFile();return false;"/>
<input class="btn" type="button" value="Cancel" onClick="cancelFile();return false;"/>
<input class="btn" type="button" value="Complete Order" onClick="completeFile();return false;"/>
</apex:pageBlockButtons>
</apex:pageBlock>
<apex:outputText styleClass="footer" value="Please click Complete Order when all the required files are uploaded. Thank you." />
</form>
<apex:form id="sfForm"><!-- rendered="{!open}"-->
<apex:inputHidden id="hiddenServerURL" value="{!serverURL}"/>
<apex:inputHidden id="fileName" value="{!fileName}"/>
<apex:inputHidden id="contentType" value="{!contentType}"/>
<apex:inputHidden id="fileType" value="{!fileType}"/>
<apex:actionFunction name="insertFile" action="{!insertFile}" oncomplete="submitFile();return false;"/>
<apex:actionFunction name="completeOrder" action="{!completeOrder}"/>
<script type="text/javascript">
var sendFile = false;
document.getElementById('{!$Component.hiddenServerURL}').value = '{!$Api.Enterprise_Server_URL_140}';
function setFileName(file) {
var f = file.replace(/\\/g, "");
f = f.replace(/C\:fakepath/g, ""); <!--Required for IE8-->
document.s3Form.key.value = "{!CustomerName}/{!OrderName}/" + f;
document.getElementById('{!$Component.fileName}').value = f;
suffix = f.lastIndexOf(".") + 1;
contentType = f.slice(suffix);
document.getElementById('{!$Component.contentType}').value = contentType;
}
function setFileType(type) {
document.getElementById('{!$Component.fileType}').value = type;
}
function checkFile() {
if (document.s3Form.file.value=="") {
alert("Please, select a file.");
return false;
}
else if (document.s3Form.fType.value=="--None--") {
alert("Please, select a file type.");
return false;
}
else {
alert("Uploading...Please click OK and wait for page to refresh.");
insertFile();
sendFile = true;
}
}
function submitFile() {
if(sendFile = false) {
return false;
}
else {
document.s3Form.submit();
}
}
function completeFile() {
completeOrder();
}
</script>
</apex:form>
这是我试图修改的javascript部分,但在对其进行了大量搜索后,我找不到任何内容
function checkFile() {
if (document.s3Form.file.value=="") {
alert("Please, select a file.");
return false;
}
else if (document.s3Form.fType.value=="--None--") {
alert("Please, select a file type.");
return false;
}
else {
alert("Uploading...Please click OK and wait for page to refresh.");
document.s3Form.submit({
success: function(){
alert("Testing!");
insertFile();
},
});
}
}
因此,如果我正确理解您的意思,您希望:
<apex:page controller="MyController">
<apex:form>
<apex:inputFile value="{!file.body}" filename="{!file.name}"/>
<apex:commandButton value="Submit" action="{!submitFile}"/>
</apex:form>
</apex:page>
+1在Apex中完成工作,而不是Javascript 但若要继续进行可能成功的黑客攻击,请尝试使用for your form submit。当它醒来时,它会检查文件插入是否成功。如果在几次民意测验后,您仍然没有成功,则标记一个超时
Javascript在Visualforce中的新奇之处可能是危险的,除非时间不是你的因素。我认为,最好先使用Visualforce/Apex选项,然后才在特殊情况下使用自定义JavaScript,或者对轻量级UI进行调整。我认为那里编写的psuedo代码的问题在于,如何验证S3文件上载是否成功?从AmazonDocs()中,S3返回一个HTTP成功代码——我如何评估我们是否已收到此成功,然后将文件令牌插入salesforce?
<apex:page controller="MyController">
<apex:form>
<apex:inputFile value="{!file.body}" filename="{!file.name}"/>
<apex:commandButton value="Submit" action="{!submitFile}"/>
</apex:form>
</apex:page>
public class MyController {
public Document file { get; set; } { file = new Document(); } // dummy object for storing binary file data
public void submitFile() {
if(!validateFile())
return;
String s3Token = submitToS3();
if(s3Token != null) {
File__c newFile = new File__c(name = file.name, s3_token__c = s3Token);
insert newFile;
}
}
}