Отправка HTTP-запроса POST для обновления содержимого файла с помощью C ++ REST SDK Casablanca

Я пытаюсь обновить содержимое файла на сервере под открытым небом, используя C ++ rest SDK. Я использую URL CMIS alfresco для отправки запроса. Чтобы быть более точным, это привязка браузера Alfresco CMIS. Я должен придерживаться привязки браузера, а не привязки атома.

Когда я отправляю запрос, он всегда обновляет версию файла, а не его содержимое. Я отправляю содержимое в теле запроса. Ниже мой код

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

Тот же код работает для загрузки нового файла, если я изменяю команду на createDocument.
Пожалуйста, дайте мне решение, чтобы обновить содержимое файла, находящегося в Alfresco через C ++ rest SDK

3

Решение

Это может помочь вам ..

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

Другие решения