iOS上传文件,有关http上传协议-RFC1867

以上是抓包HTML input file标签上传的内容
只要模拟上面http 的header跟body就可以成功。
整体说明:
post 上传文件时,以在http body里面带参数,参数的格式,根据RFC1867协议要求写成如下
在http header 里面定义 boundary ,boundary的值为body里面分隔参数的标志。
Content-Type: multipart/form-data; boundary=----------LlcUploadTaskWithRequest
假设 post 过去,两个参数 user="loganv"&pwd="123456" 跟一个二进制文件 file,服务端通过字段 'file' 获取文件流,文件名字叫做filename.png。
------------LlcUploadTaskWithRequest
Content-Disposition: form-data; name="user" loganv
------------LlcUploadTaskWithRequest
Content-Disposition: form-data; name="pwd" 123456
------------LlcUploadTaskWithRequest
Content-Disposition: form-data; name="file"; filename="filename.png"
Content-Type: application/octet-stream ÿØÿàJFIFHHÿá¼ExifMM*JR(i(此处为上传的二进制文件数据)
把下面这个体当成一对整体来看
------------LlcUploadTaskWithRequest
Content-Disposition: form-data; name="user" loganv
第一行:以header 里面定义的 boundary的值,在前面加"--",,以"\r\n"结尾
第二行:定义了参数的键 user ,以"\r\n"结尾
第三行:"\r\n"
第四行:参数的值 123456,以"\r\n"结尾
如果参数是文件,需要在上面的低二行下面增加一行定义文件的类型 MIME type
iOS 实现上传,swift2.0 主要代码
第一步:自定义boundary分割标志,在给header加个 Content-Type;
let post_boundary = "----------LlcUploadTaskWithRequest"
let reqq = NSMutableURLRequest(URL: NSURL(string: "http://172.16.0.199/upload/uploadIpa.php")!)
reqq.HTTPMethod = "POST"
reqq.setValue(post_boundary, forHTTPHeaderField: "Content-Type")
第二步:拼接http body 需要 post 过去的参数,跟二进制文件;服务端通过字段 'file' 获取文件流;
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
var paramStr = ""
if param != nil{
for (k, v) in param!{
paramStr += uploadPostParamInBody(k, nameValue: v.description)
}
}
paramStr += uploadPostParamInBody("file", filename: "filename.png")
let boundary = paramStr.dataUsingEncoding(NSUTF8StringEncoding)?.mutableCopy() as? NSMutableData
let pdata = NSData(data: multipartFormData!)
let boundary_end = ("\r\n--" + post_boundary + "--").dataUsingEncoding(NSUTF8StringEncoding)
boundary?.appendData(pdata)
boundary?.appendData(boundary_end!)
拼接参数的方法
//---- uploadTaskWithRequest 上传
/*
name: post body里面带的参数的名称,服务器根据这个名称取得对应的参数值;
filename: 文件的名字比如 logo.png;
MIMEtyp: 为application/octet-stream代表任何二进制流都可以,图片传image/jpeg; */
public func uploadPostParamInBody(name: String, filename: String = "", nameValue: String = "", MIMEtype: String = "application/octet-stream") -> String{
var content = "--" + LlcHttpRequest.post_boundary + "\r\n"
if filename == ""{
content += "Content-Disposition: form-data; name=\"\(name)\"\r\n\r\n";
content += "\(nameValue)\r\n";
}
else{
content += "Content-Disposition: form-data; name=\"\(name)\"; filename=\"\(filename)\"\r\n";
content += "Content-Type: \(MIMEtype)\r\n\r\n";
}
return content
}
第三步:请求
let task = session.uploadTaskWithRequest(req.request, fromData: boundary){
(obj: NSData?, resp: NSURLResponse?, err: NSError?) -> Void in
if let respHtml = resp as? NSHTTPURLResponse {
if respHtml.statusCode == {
if obj != nil{
var resu: AnyObject? = String(data: obj!, encoding: NSUTF8StringEncoding)
if let json = try? NSJSONSerialization.JSONObjectWithData(obj!, options: .AllowFragments){
resu = json
}
}
}
}
else{
fail(resp: resp, error: err)
}
if err != nil{
fail(resp: resp, error: err)
}
}
task.resume()
完了!
附上PHP服务端简单接受文件上传的代码
<?php $text = isset($_REQUEST['text']) ? $_REQUEST['text'] : "";
echo 'success<br>';
if ($_FILES["file"]["error"] > ){
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
elseif ($_FILES["file"]["size"] > **) {
echo 'file too big';
}
else{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / ) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"] . '<br />'; $isipa = false;
$uploadSrc = '../download/ipa/'.$_FILES["file"]["name"];
if ( preg_match('/\.ipa$/', $_FILES["file"]["name"]) ) {
$isipa = true;
$uploadSrc = '../download/ipa/'.'test01.ipa';
} if (file_exists($uploadSrc) && $isipa ){
// echo $_FILES["file"]["name"] . " already exists. ";
rename($uploadSrc, '../download/ipa/'.date('Y-m-d H:i:s').'.ipa');
}
move_uploaded_file($_FILES["file"]["tmp_name"], $uploadSrc);
echo "Stored in: " . $uploadSrc.'<br>';
echo '上传成功!';
}
iOS上传文件,有关http上传协议-RFC1867的更多相关文章
- 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。
用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...
- Git学习笔记——从一台电脑上传文件到Github上
目标:从一台电脑上传文件到Github上 前提: 1.这里假定已在Github上创建了仓库,建立了仓库 2.已在这台电脑上安装了Git客户端 实验环境: 1.Windows 10 64位,已安装了Gi ...
- 7.Flask-上传文件和访问上传的文件
1.1.上传文件和访问上传的文件 upload_file_demo.py from flask import Flask,request,render_template import os from ...
- Flask-上传文件和访问上传的文件
1.1.上传文件和访问上传的文件 upload_file_demo.py from flask import Flask,request,render_template import os from ...
- XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地
使用XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地. 1.第一种方法是最常用的 :如果下载了Xshell和Xftp,Ctrl+Alt+F就可以选择文件的互传了!(虚拟机/云服务 ...
- Android上传文件至服务器(上)
每一次都不能上首页,真悲催..管理员让我上一次首页? 很多时候我更愿意一个人写代码,与其在垃圾代码上改改改,我更愿意直接重构. 整洁的代码简单直接.整洁的代码如同优美的散文.整洁的代码从不隐藏设计者的 ...
- ajax上传文件以及实现上传进度条(转载)
做微信企业号的时候,在‘我的日志'功能模块里边需要添加一个上传文件的功能,并且要显示上传过程中的进度条和提交后的文件名列表,于是做了基于ajax的文件上传,UI用的是MUI框架,后台是TP框架 前端代 ...
- RN 上传文件到以及上传文件到七牛云(初步)
本文将介绍: 如何使用原生 Javascript 上传文件 如何使用七牛云 SDK 上传文件到七牛云 在 App 中文件上传是一个非常重要的需求,但是翻遍 React Naitve 的官方文档没有发现 ...
- Linux下开发python django程序(设置admin后台管理上传文件和前台上传文件保存数据库)
1.项目创建相关工作参考前面 2.在models.py文件中定义数据库结构 import django.db import modelsclass RegisterUser(models.Model) ...
- java-上传文件与现实上传文件
项目结构: 项目展示: 数据库: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.5.53 : Database - fileupload ********* ...
随机推荐
- 【转】itunes connect 如何修改主要语言
原文网址:http://blog.csdn.net/yuedong56/article/details/50662181 刚开始提交app,没有做国际化(本地化),提交的app只有简体中文一种语言,第 ...
- Solr单机部署和集群部署
用到的相关jar包:http://pan.baidu.com/disk/home#list/path=%2Fsolr Solr目录结构 Solr 目录 Contrib :solr 为了增强自身的功能, ...
- Arduino中的数据类型范围
注意int不是4字节而仅仅是2字节!!! int: -32,768 ~ 32,767 (2字节) long: 4字节 http://www.arduino.cc/en/Reference/Int
- WebAPI 时代
引言 小编跳槽到现任公司有一段时间,在这个公司对于小编是各种挑衅啊,也颠覆了小编之前的编程生涯,在前面 的博客中小编隆重介绍了angularJS这个大神,这个让我不堪回首的两周,真是黑色天使啊!从现在 ...
- nginx上传目录配置,禁止执行权限
我们经常会把网站的图片文件上传目录设置为只可上传文件但不能执行文件,就是要禁止执行权限,小编来给大家举一个上传目录配置,禁止执行权限方法,各位可参考. 如果不让有执行权限最简单的办法 代码如下 复制 ...
- bjfu1262 优先队列
比较典型的应用优先队列的题.题目是在一个长为n的数组中,依次问m个数中的最小值.那么把值和下标做成一个结构体,放进优先队列里,每次移动窗口就把该T的T掉,剩下的最小值就是答案,复杂度nlogn,轻松a ...
- <转>如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
原文链接:http://www.vaikan.com/use-multiple-cpu-cores-with-your-linux-commands/ 你是否曾经有过要计算一个非常大的数据(几百GB) ...
- 约瑟夫环 --- 面向对象 --- java代码
约瑟夫环 的 面向对象 解法 罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个 ...
- DOM笔记(八):JavaScript执行环境和垃圾收集
一.执行环境 在有关于JavaScript对象或者this的指向问题时,脱离不了的另外一个概念就是执行环境,即上下文环境.执行环境在JavaScript是一个 很重要的概念,因为它定义了变量或函数有权 ...
- log4net--帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具
1. log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. 2. Log4net的结构如下 ...