IDOL查看文档问题

时间:2014-06-07 10:44:53

标签: salesforce hp-haven hp-idol-ondemand

我正在使用IDOL API将pdf文件转换为Salesforce Apex类中的html。

当我使用简单的html时,例如:

<html>
    <body>
        <form action="https://api.idolondemand.com/1/api/sync/viewdocument/v1"
         method="Post" enctype="multipart/form-data">

            <input type="hidden" name="raw_html" value="true"/>
            <input type="hidden" name="apikey" 
             value="{apikey removed}"/>
            <input type='FILE'  name='file'/><br/>
            <input type='submit' name='upload_btn' value='Submit'/> 
        </form>         
    </body>
</html>

然后这是有效的。但是当我使用APEX代码httprequest时,这就是一个糟糕的请求。

我的APEX代码是:

public HTTPResponse uploadFile(Attachment file){ 

        //String boundary = '---------------------\n';
        String header = '\n';               
        header += 'Content-Disposition: form-data; name="file"; filename="'
                    + file.Name +'"\nContent-Type: application/pdf\n\n';             
        String footer = '\n';

        String querybody = '\n Content-Disposition: form-data; 
                                        name="raw_html"\n\n'+true+'\n';
         querybody = querybody + '\n Content-Disposition: form-data; 
                name="apikey"\n\n {apikey removed} \n\n';

      //base64 encoded body
      String bodyEncoded = EncodingUtil.base64Encode(file.body);

      //last encoded body bytes
      String last4Bytes = 
               bodyEncoded.substring(bodyEncoded.length()-4,bodyEncoded.length());
      //if the last 4 bytes encoded base64 ends with the padding character (= 
               or ==) then re-encode those bytes with the footer
      //to ensure the padding is added only at the end of the body
      if(last4Bytes.endsWith('='))
      {
           Blob decoded4Bytes = EncodingUtil.base64Decode(last4Bytes);
           HttpRequest tmp = new HttpRequest();
           tmp.setBodyAsBlob(decoded4Bytes);
           String last4BytesFooter = tmp.getBody()+footer;  
           bodyEncoded = querybody + header + 
                        bodyEncoded.substring(0,bodyEncoded.length()-4) +               
                        EncodingUtil.base64Encode(Blob.valueOf(last4BytesFooter)) +
                            footer;

      }
      else
      {
            bodyEncoded = querybody + header + bodyEncoded + footer;
      }

       bodyEncoded = querybody;// + header + bodyEncoded + footer;
      System.debug('>>>>>>>>>>>>>>>>>>>>>>' + bodyEncoded);        

      HttpRequest req = new HttpRequest();
      req.setHeader('Content-Type','multipart/mixed');
      req.setMethod('POST');

              req.setEndpoint('https://api.idolondemand.com/1/api/sync/viewdocument/v1'
              ); 
      req.setBody(bodyEncoded);
      req.setTimeout(120000);                 
      req.setHeader('Content-Length', String.valueof(req.getBody().length()));
      Http http = new Http();
      Httpresponse res = http.send(req);         
      return res;
    }

我的Visual force页面仅包含:

<apex:page controller="IDOLService">

  <apex:form >  
    <apex:pageBlock title="File Input">
      <apex:pageBlockSection >
        <apex:pageBlockSectionItem >        
          <apex:inputFile value="{!file.body}" filename="{!file.Name}"/>  
          <apex:commandButton action="{!showPreview}" value="Show Preview"/>          
        </apex:pageBlockSectionItem>
      </apex:pageBlockSection>      
     </apex:pageBlock>

    <apex:outputpanel id="docpanel">
      {!result}
    </apex:outputpanel>  
  </apex:form>
  </apex:page>

这给了我7005的错误,错误的请求。

1 个答案:

答案 0 :(得分:1)

我们尝试使用提供的代码进行复制,但如果没有看似遗漏的IDOLService控制器代码的其余部分,则很难正确复制。我们之前没有尝试从顶点发布http的多部分表单(并且一瞥其他一些问题表明它并不完全简单)所以需要一些时间来组合一个有效的例子。

请您将更多信息发送到idolondemand(at)hp.com,以便团队进行更深入的审核吗?

此致

hughesthe1st
(我为惠普工作)