如何在Symbian中使用Http上传大文件(转帖)

2024-03-30 19:08

本文主要是介绍如何在Symbian中使用Http上传大文件(转帖),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/chuckGao/archive/2010/08/03/5785261.aspx

 

 

最近因为项目的关系,研究了一下在 Symbian 中使用 Http 协议上传 multipart/form-data 格式数据的实现方法。由于要求上传的数据较大,所以研究了如何在 Nokia Http Exmaple 的基础上,使用 MHTTPDataSupplier 派生类分包上传的实现。

 

1. 在实现 Http 协议的类中(以 HttpEngine 为例),需要重写下面几个函数:

void SetupConnectionL();

void IssueHTTPGetL();

void IssueHTTPPostL();

void IssueHTTPDeleteL();

void CancelTransaction();

// 上传大文件时,需要特别关注下面 4 个类

void ReleaseData();

TBool GetNextDataPart(TPtrC8& aDataPart);

TInt Reset();

TInt OverallDataSize();

在搭建初步的 HttpEngine 框架时,可以根据需求,重写 SetupConnectionL() Get Post Delete 等函数,具体的实现方法可参考 Http 协议完成。

2.Nokia Http Exmaple 适用的情况为一个 Chunk Post 的时候,如果想要上传较大的文件,需要重写上面 4 个类的实现。下面是 Http Engine 的简要工作流程:

A.       通过 OverallDataSize 函数获得上传文件的总大小,这意味着,是整个上传文件的长度,而不是每次分包上传的长度。如果 Size 错误或者 Size 大小不确定,都会引起错误。

 

B.       开始上传,将会调用 GetNextDataPart(TPtrC8& aDataPart) 得到本次上传的数据。如果是分包上传,这里是当前上传包的数据内容

 

C.       如果上传过程中出错,将会返回,并重新调用 A 。如果成功,将会 ReleaseData(); 并根据 GetNextDataPart 之前的返回值判断是否还需要调用 GetNextDataPart 。在 C 中存在很关键的一环,如果发送过程中底层出错,将会重新通过 OverallDataSize 获得上传的总大小,而进入 OverallDataSize 就表示一切操作重头再来了,所以需要在 OverallDataSize 里面重置所有的数据指针,而一般的方法通过 Reset 将数据指针指向第一块数据。如果是使用状态机的方式进行数据传送,则需要将状态置为最先一步操作的状态。

 

 

D.       每次数据传送完成,需要调用 ReleaseData() 释放之前发送的数据。在分包传输时,如果数据没有传完,需要显示调用 RHTTPTransaction NotifyNewRequestBodyPartL() 函数通知 Engine 。不然,不会进入到 GetNextDataPart

 

3. 对于 multipart 类型数据的上传,推荐采用状态机的方式。在每个状态中上传不同 bounary 的数据。对于上传大文件,也尽量控制分包大小在 100k 以内,以免内存分配不够而引发错误

 

下面是一些实现代码,有些具体的操作放在了 observer 里面进行

TBool CHttpEngine::GetNextDataPart ( TPtrC8 & aDataPart)

     {

      return iObserver .GetNextDataPart(aDataPart);

     }

void CHttpEngine::ReleaseData ()

     {

     if ( iObserver .BytesTransfered() != iOverDataSize )        

          iTransaction . NotifyNewRequestBodyPartL ();

 

     iObserver .ReleaseData();

     }

TInt CHttpEngine::Reset ()

     {

     //Reset the state

     iObserver .Reset();

     return KErrNone;

     }

TInt CHttpEngine::OverallDataSize ()

     {

     Reset();

     iOverDataSize = iObserver .OverallDataSize();

     if (0 != iOverDataSize )

          return iOverDataSize ;

     return KErrNotFound;

     }

这篇关于如何在Symbian中使用Http上传大文件(转帖)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/862325

相关文章

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一