iOS7推出的NSURLSession简化了NSURLConnection的文件上传和下载的工作,本文记录如何配置WebDAV服务以支持PUT方式的文件上传。

一. 配置WebDAV服务器

1. 修改httpd.conf

1> 打开终端,依次输入:

cd /etc/apache2/
sudo vi httpd.conf

2> 在vi中输入

/httpd-dav.conf

查找httpd-dav.conf

3> 将该行最前面的 # 注释删除

4> 保存并退出

输入

:wq

2. 修改httpd-dav.conf

1> 在终端中依次输入:

cd /etc/apache2/extra
sudo vi httpd-dav.conf

2> 按照以下内容修改httpd-dav.conf中的内容

提示:仅修改了授权类型和用户密码文件两个位置

DavLockDB "/usr/var/DavLock"

Alias /uploads "/usr/uploads"

<Directory "/usr/uploads">
Dav On Order Allow,Deny
Allow from all #用户的授权类型
AuthType Basic
AuthName DAV-upload # You can use the htdigest program to create the password database:
# htdigest -c "/usr/user.passwd" DAV-upload admin
# 用户密码文件
AuthUserFile "/usr/webdav.passwd"
AuthDigestProvider file # Allow universal read-access, but writes are restricted
<LimitExcept GET OPTIONS>
require user admin
</LimitExcept>
</Directory>

说明:

按照上述配置文件,可以通过URL->http://localhost/uploads,将文件上传至/usr/uploads目录

上传文件所使用的用户名是:admin

3> 保存并退出

输入

:wq

3. 建立文件夹并配置文件

1> 创建admin的密码,在终端中输入:

sudo htpasswd -c /usr/webdav.passwd admin

然后输入admin的密码,密码文件会保存在/usr/webdav.passwd中

2> 设置webdav.passwd权限

sudo chgrp www /usr/webdav.passwd

3> 建立var文件夹,以保存DavLockDB相关文件

sudo mkdir -p /usr/var
sudo chown -R www:www /usr/var

4> 建立上传文件夹:uploads

sudo mkdir -p /usr/uploads
sudo chown -R www:www /usr/uploads

5> 重新启动Apache

sudo apachectl -k restart

4. 测试

打开Finder,在菜单中选择“前往”“连接服务器”,在地址栏中输入:http://localhost/uploads

然后用户名admin及在终端设置的密码,连接至服务器,并测试更新文件。

二. 使用NSURLSessionUploadTask实现文件上传

- (IBAction)uploadFile
{
// 要上传的文件
UIImage *image = [UIImage imageNamed:@"123.jpg"];
NSData *imageData = UIImageJPEGRepresentation(image, 1.0f); // 上传的文件名
NSString *urlString = @"http://localhost/uploads/demo.jpg";
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
// 使用PUT方法
[request setHTTPMethod: @"PUT"]; // 用户授权
NSString *basicAuthCredentials = [NSString stringWithFormat:@"%@:%@", @"admin", @""];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", AFBase64EncodedStringFromString(basicAuthCredentials)];
[request setValue:authValue forHTTPHeaderField:@"Authorization"]; [request setHTTPBody: imageData];
[request setValue:@"image/jpg" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [imageData length]] forHTTPHeaderField:@"Content-Length"]; // URLSession
NSURLSession *session = [NSURLSession sharedSession];
// 上传任务
NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (!data) {
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@ %@", result, response);
} else {
NSLog(@"upload ok!");
}
}]; [task resume];
}

另外,还需要一个对字符串进行Base64编码的方法,代码如下:

static NSString *AFBase64EncodedStringFromString(NSString *string)
{
NSData *data = [NSData dataWithBytes:[string UTF8String] length:[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
NSUInteger length = [data length];
NSMutableData *mutableData = [NSMutableData dataWithLength:((length + ) / ) * ]; uint8_t *input = (uint8_t *)[data bytes];
uint8_t *output = (uint8_t *)[mutableData mutableBytes]; for (NSUInteger i = ; i < length; i += ) {
NSUInteger value = ;
for (NSUInteger j = i; j < (i + ); j++) {
value <<= ;
if (j < length) {
value |= (0xFF & input[j]);
}
} static uint8_t const kAFBase64EncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; NSUInteger idx = (i / ) * ;
output[idx + ] = kAFBase64EncodingTable[(value >> ) & 0x3F];
output[idx + ] = kAFBase64EncodingTable[(value >> ) & 0x3F];
output[idx + ] = (i + ) < length ? kAFBase64EncodingTable[(value >> ) & 0x3F] : '=';
output[idx + ] = (i + ) < length ? kAFBase64EncodingTable[(value >> ) & 0x3F] : '=';
} return [[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding];
}

在OS X 10.9配置WebDAV服务器联合NSURLSessionUploadTask实现文件上传的更多相关文章

  1. 在OS X 10.9配置WebDAV服务器联合NSURLSessionUploa…

    CHENYILONG Blog   在OS X 10.9配置WebDAV服务器联合NSURLSessionUploadTask实现文件上传iOS7推出的NSURLSession简化了NSURLConn ...

  2. CentOS下安装配置NFS并通过Java进行文件上传下载

    1:安装NFS (1)安装 yum install nfs-utils rpcbind (2)启动rpcbind服务 systemctl restart rpcbind.service 查看服务状态 ...

  3. java:ssh连接服务器,实现本地文件上传和下载

    1.连接至服务器:ssh hp@10.10.17.16 -p 5555    下载文件:scp -r hp@10.10.17.16:/ccc(服务器路径,文件夹下所有文件)  /path(本地路径) ...

  4. .Net 网站配置文件 webconfig 配置。 字体图标+视频播放 以及 文件上传

    ASP.NET MVC 上传大文件时404 原来IIS7的上传文件大小,即便是在经典模式下,也一定要在system.webServer里设置,加上去就OK了 <system.webServer& ...

  5. suse linux 10 下配置vpn服务器(pptp)

     一.安装所需的软件包:      pptpd-*.rpm      ppp-*.rpm      pptp-*.rpm     一般情况下系统已经将pptp和ppp包安装好了,所以只需安装pptpd ...

  6. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  7. post提交/文件上传服务器修改

    第一步:修改在php5下POST文件大小的限制   1.编修php.ini   找到:max_execution_time = 30 ,这个是每个脚本运行的最长时间,单位秒,修改为: max_exec ...

  8. 移动商城第四篇【Controller配置、添加品牌之文件上传和数据校验】

    Controller层配置 编写SpringMVC的配置文件 springmvc.xml <?xml version="1.0" encoding="UTF-8&q ...

  9. springMvc---跨服务器文件上传(实测总结)

    序言: 该案例是采用springMvc实现跨服务器图片上传功能,其中用到的主要类和工具有:CommonsMultipartResolver.jquery.form.js.如果要实现多个文件上传,只需要 ...

随机推荐

  1. 我的工具:Db SQL Monitor

    SQL Monitor 是一款界面简洁.绿色小巧的sql活动监视器,它能够帮助用户对 SQL Server 运行进程和Job进行实时监视,您可以查看当前执行的SQL/命令并终止. 工具下载地址:htt ...

  2. 【c语言】分配内存与释放内存

    提示:现在内存区定出一片相当大的连续空间(如1000字节).然后开辟与释放都在此空间进行.假设指针变量p原已指向未用空间的开头,调用alloc(n)后,开辟了n个字节可供程序适使用.现在需要使 p的值 ...

  3. P1119 灾后重建(floyd进阶)

    思路:这道题看n的范围很小(n<=200),显然就用floyd可以解决的问题,但又并不是简单的floyd算法,还是需要一些小小的变化.一开始我的思路是先跑一次弗洛伊德最短路,这样子显然复杂度很高 ...

  4. JavaScript继承总结

    1.创建对象 1.字面量对象 2.构造函数 3.Object.create //1.字面量 var obj={ name: '字面量', show: function(){ console.log(t ...

  5. form组件+cookie+session总结

    1.forms 组件 -数据校验功能 1.定义 -新建一个py文件 -导入from django import forms -写一个类继承 forms.Form -把你需要校验的(字段的条件)属性写到 ...

  6. 网路知识总结(session&&Cookie&&三次握手&&请求头)

    1. 请说明Session和Cookie的作用和区别 1) Cookie 存在前端 前端需要拿着cookie访问后端,Session在服务器上(文件,数据库,如Redis) 2) web访问Serve ...

  7. Hackers' Crackdown UVA - 11825 (状压dp)

    给出n个电脑,每个电脑连着n个服务,然后每个电脑都连着m个邻电脑,如果当前的电脑某个服务被断开了,相邻的电脑的服务也会被断开,每个电脑都只能操作一次,问你最多可以让多少种服务被断开.一种服务被断开的条 ...

  8. ubuntu16.04安装中文输入法

    https://blog.csdn.net/u011795345/article/details/53041707

  9. vim打开退出命令

    打开文件方法:cd /Users/liuchang/.jenkins/secrets && vim initialAdminPassword 退出方法:先按ESC,再输入冒号,在输入命 ...

  10. centos7 部署安装gitlab服务器

    概念: git 是一种版本控制系统,是一个命令,是一种工具 gitlib 是用于实现git功能的开发库 github 是一个基于git实现的在线代码托管仓库,包含一个网站界面,向互联网开放 gitla ...