This page was last modified 22:34, 13 December 2007.
Symbian C++ : Multipart/form-data
From Forum Nokia Wiki
The following code can be used to upload any file, image, text , video etc.. as a binary file to a server.
The HTTPEngine should have MHTTPDataSupplier as its parent class, as the following functions need to be implemented for the upload process
TBool GetNextDataPart(TPtrC8& aDataPart); void ReleaseData(); TInt Reset(); TInt OverallDataSize();
The content-type for the post should be
_LIT8(KPostContentType, "multipart/form-data; boundary=AaB03x");
In the MHFRunL the case EGotResponseBodyData should do this
MHTTPDataSupplier* dataSupplier = aTransaction.Response().Body(); TPtrC8 ptr; dataSupplier->GetNextDataPart(ptr); // Convert to 16-bit descriptor HBufC* buf = HBufC::NewLC(ptr.Length()); buf->Des().Copy(ptr); // Append to iResponseBuffer if (iResponseBuffer==NULL) { iResponseBuffer = buf->AllocL(); } else { iResponseBuffer = iResponseBuffer->ReAllocL(iResponseBuffer->Length()+buf->Length()); iResponseBuffer->Des().Append(*buf); } // Release buf CleanupStack::PopAndDestroy(buf); if(!iDataAvailable) { iRunning=EFalse; iTransaction.Close(); } else { dataSupplier->ReleaseData(); }
POST code
Get the file you want to upload in binary format
RFs aFs; User::LeaveIfError(aFs.Connect()); CleanupClosePushL(aFs); RFile aFile; User::LeaveIfError(aFile.Open(aFs, iFileName, EFileShareAny)); TInt aSize; User::LeaveIfError(aFile.Size(aSize)); iPostDataImage = HBufC8::NewL(aSize); TPtr8 aPtr = iPostDataImage->Des(); //Obviously we have to read in the data to the iPostDataImage (ray) aFile.Read(0, aPtr, aSize); aFile.Close(); aFs.Close(); CleanupStack::PopAndDestroy(&aFs);
Using EFileShareAny ensures that if the file can be opened by any other application. The file is read into iPostDataImage as a binary file.
Now create the upload format
_LIT8(KDataStart,"--AaB03x"); _LIT8(KCrlf,"\r\n"); _LIT8(KContent,"Content-Disposition: form-data; name='userfile'; filename='"); _LIT8(KFileCompletion,"'"); _LIT(KContent2,"Content-Type: image/gif"); _LIT(KContent3,"Content-Transfer-Encoding: binary"); _LIT8(KDataEnd,"--AaB03x--"); iPostData = HBufC8::NewL(650+aPtr.Length()); TPtr8 iPostDataPtr = iPostData->Des(); iPostDataPtr.Zero(); iPostDataPtr.Append(KCrlf); iPostDataPtr.Append(KDataStart); iPostDataPtr.Append(KCrlf); iPostDataPtr.Append(KContent); iPostDataPtr.Append(aFname); iPostDataPtr.Append(KFileCompletion); iPostDataPtr.Append(KCrlf); iPostDataPtr.Append(KContent2); iPostDataPtr.Append(KCrlf); iPostDataPtr.Append(KContent3); iPostDataPtr.Append(KCrlf); iPostDataPtr.Append(KCrlf); iPostDataPtr.Append(aPtr); //the file in binary iPostDataPtr.Append(KCrlf); iPostDataPtr.Append(KDataEnd); iPostDataPtr.Append(KCrlf);
Submit the transaction
RHTTPHeaders hdr = iTransaction.Request().GetHeaderCollection(); AddHeaderL(hdr, HTTP::EUserAgent, KUserAgent); AddHeaderL(hdr, HTTP::EAccept, KAccept); AddHeaderL(hdr, HTTP::EContentType, KPostContentType); MHTTPDataSupplier* dataSupplier = this; iTransaction.Request().SetBody(*dataSupplier); iTransaction.SubmitL();
Implement DataSupplier functions
TBool CHTTPExampleEngine::GetNextDataPart(TPtrC8& aDataPart) { TBool retVal = EFalse; aDataPart.Set(iPostData->Des()); retVal = (aDataPart.Length() == 0); iDataAvailable=retVal; return retVal; } TInt CHTTPExampleEngine::OverallDataSize() { if(iPostData) return iPostData->Length(); else return KErrNotFound ; } void CHTTPExampleEngine::ReleaseData() { if(iDataAvailable) iTransaction.NotifyNewRequestBodyPartL(); }
Any binary file can be uploaded with this upload code.
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| send Form with POST on HTTPConnection | saifulhq | Mobile Java Networking & Messaging & Security | 1 | 2007-09-24 08:49 |
| Problem viewing Multipart Messages in toolkit | soma_dey | General Browsing | 0 | 2002-11-13 02:08 |
| MaoscOpenComplete() not bieng called!!!! | gmsk19 | General Symbian C++ | 1 | 2007-02-28 12:56 |
| Understanding how to send MMS | vict3m | General Messaging | 2 | 2005-08-24 22:55 |
| How To Auto-Save a Form | Vik The Red | Python | 0 | 2008-03-26 11:34 |
