2014-12-31 66 views
3

我正嘗試使用C++ rest sdk更新露天服務器中文件的內容。我使用露天CMIS網址發送請求。更具體的說,它是Alfresco CMIS瀏覽器綁定。我必須堅持瀏覽器綁定而不是原子綁定。使用C++ REST SDK發送更新文件內容的HTTP POST請求Casablanca

當我發送請求時,它總是更新文件的版本而不是內容。我在請求body.Below發送的內容是我的代碼

void UpdateFileContent() 
{ 
    concurrency::streams::basic_istream<unsigned char> fileStream = file_stream<unsigned char>::open_istream("C:\Desktop\Sample.txt").get(); 

    concurrency::streams::stringstreambuf streamBuffer; 
    fileStream.read_to_end(streamBuffer).get(); 
    std::string textFile = move(streamBuffer.collection()); 
    fileStream.close(); 
    streamBuffer.close(); 
    std::string textBoundary = "--FORMBOUNDARY--"; 
    std::string textBody = ""; 
    textBody += "--" + textBoundary + "\r\n"; 
    textBody += "Content-Disposition:form-data;name=Sample;filename=Sample\r\n"; 
    textBody += "Content-Type: application/octet-stream\r\n\r\n"; 
    textBody +=textFile+"\r\n"; 
    textBody += "--" + textBoundary + "--\r\n"; 
    web::uri_builder builder(U("http://Alfresco-Server:8080/alfresco/api/-default-/public/cmis/versions/1.1/browser/root/Sites/")); 
    builder.append_path(U("siteName/documentLibrary/FolderName/Sample3.doc")); 
    builder.append_query(U("alf_ticket"),ticket); 
    builder.append_query(U("cmisaction"),U("update")); 
    builder.append_query(U("propertyId[0]"),U("cmis:name")); 
    builder.append_query(U("propertyValue[0]"),U("SampleFileUpdate")); 
    http_client client(builder.to_string()); 
    http_request req; 
    req.set_method(methods::POST); 
    req.headers().set_content_type(L"multipart/form-data;boundary=--FORMBOUNDARY--"); 
    req.headers().set_content_length(textBody.length()); 
    req.set_body(textBody); 
    http_response response = client.request(req).get(); 
    std::cout<<response.status_code(); 
} 

相同的代碼適用於上傳新文件,如果我改變cmisaction到createDocument。 請給我一個解決方案更新文件的內容居住在露天throught C++ SDK休息

回答

1

這可以幫助你..

std::string CMISRESTMETHOD:: UpdateFile(std::string ticket,std::string hostName,std::string portNum,std::string updateFilepath,std::string ClientpathtoDocument,bool ismajorVersion) 
{ 
    try 
    { 
     if(ticket.empty()) 
     { 
      throw std::runtime_error("Please pass the authentication ticket"); 
     } 
     else if(hostName.empty()) 
     { 
      throw std::runtime_error("Please pass the hostName"); 
     } 
     else 
     { 
     ReplaceStringInPlace(updateFilepath," ","%20"); 
     Concurrency::streams::basic_istream<unsigned char> fileStream =Concurrency::streams::file_stream<unsigned char>::open_istream(utility::conversions::to_string_t(ClientpathtoDocument)).get(); 
     // Read file stream to string 
     concurrency::streams::stringstreambuf streamBuffer; 
     fileStream.read_to_end(streamBuffer).get(); 
     std::string textFile = move(streamBuffer.collection()); 
     fileStream.close(); 
     streamBuffer.close(); 
     std::string url="http://"+hostName+":"+portNum+"/alfresco/api/-default-/public/cmis/versions/1.1/browser/root"; 
     string_t objectId=getProperties(updateFilepath,conversions::to_string_t(ticket),"cmis:objectId",url); 
     if(!objectId.empty()) 
     { 
      int findPos=objectId.find(';'); 
      string_t objectID=objectId.substr(1,findPos-1); 
      string_t majorVersion=L"false"; 
      if(ismajorVersion) 
      { 
       majorVersion=L"true"; 
      } 
      std::string atomUrl="http://"+hostName+":"+portNum+"/alfresco/api/-default-/public/cmis/versions/1.1/atom"; 
      web::uri_builder builder(conversions::to_string_t(atomUrl)); 
      builder.append_path(U("/content/id")); 
      builder.append_query(U("alf_ticket"),conversions::to_string_t(ticket)); 
      builder.append_query(L"id",objectID); 
      builder.append_query(L"major",majorVersion); 
      http_client client(builder.to_string()); 
      http_request req; 
      req.set_method(methods::PUT); 
      req.set_body(textFile); 
      req.headers().set_content_length(textFile.length()); 
      http_response res=client.request(req).get(); 
      if(res.status_code()!=201 && res.status_code()!=200) 
      { 
      throw std::runtime_error(getStatusCodeInfo(res.status_code())); 
      } 
      return getStatusCodeInfo(res.status_code()); 
     } 
     else 
     { 
      throw std::runtime_error("The requested document property is not available.Could not update the document"); 
     } 
     } 
    } 
    catch(std::exception &ex) 
    { 
     throw std::runtime_error(ex.what()); 
    } 
}