Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VisualForce页面中的Javascript-表单提交成功,触发顶点?_Javascript_Salesforce_Apex Code_Visualforce - Fatal编程技术网

VisualForce页面中的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="

现在,下面的代码在提交时,首先插入一个文件,然后提交表单。这是有问题的-我需要它验证表单是否已成功发布到AmazonS3,然后插入(令牌)文件,以便它可以链接到它

我基本上需要反转SubmitFile和InsertFile,但我不确定如何反转(如果表单成功发送,则运行另一个javascript函数)。看到底部的尝试…这可能吗

   <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();
                },
            });
        }
    }

因此,如果我正确理解您的意思,您希望:

  • 验证文件
  • 将文件上载到AmazonS3
  • 将文件令牌保存到salesforce
  • 不要破坏你的计划,但你可以尝试在apex完成整个程序。这里有一些伪代码。Salesforce还开发了一个用于与AmazonS3协作的应用程序,因此您不必从头开发所有内容

    Visualforce页面:

    <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;
        }
      }
    }