Symbian 中上传文件|Symbian C++ : Multipart/form-data

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.

Retrieved from "http://wiki.forum.nokia.com/index.php/Symbian_C%2B%2B_:_Multipart/form-data"

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值