如何在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

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1