阿帕奇,永远滴神!
承接macbook篇,这次配置我自己的笔记本电脑(win7系统)的webdav服务器虽然也花了两天,但我认为在windows上配置还是相对更友好的,花的时间多主要是我走了弯路。
好在最后还是成功了,心里一块大石头落了地,现在的成果可以让我最后不至于交不了差。
1、配置windows版webdav路上的坑
百度“windows7 配置 webdav”,出来最多的结果肯定是让你启用IIS功能的。毕竟是系统自带的功能,兼容性最好对吧?
win7创建webdav - 百里孤坟 - 博客园www.cnblogs.com然而IIS完美诠释了什么叫“微软出品,必属淘汰品”。
如何解决这个问题,百度肯定能得到各类牛鬼蛇神的答案。大致有什么你的系统不是正版啦,你应该开启一些权限啦,你要调低UAC的等级啦。在众多方案中我基于我的本本可能缺失了一些组件的猜测,选择了下载Microsoft Web Platform Installer的方案。
Microsoft Web Platform Installer 2.0 Betadownload.pchome.net然而史一般的体验告诉我,我不应该再在这个问题上纠结下去了。
我误打误撞找到了一篇吐槽的帖子,(V2EX?有点熟欸?我想起来了配置macbook的时候我也找过这上面的吐槽贴。)
https://www.v2ex.com/t/598070www.v2ex.com成功人士的博文永远是顺顺利利的,有时只有吐槽贴才能给钻牛角尖的你指条明路。
帖子里有提到另外两种工具:nextcloud和caddy。我先搜了nextcloud,吹的很好但是始终绕不开Linux,可是我已经没时间研究换Linux系统了。于是又去看了caddy。
几乎所有的教程都推荐官方网站去下载,我一看官网还挺好的,适配系统,要什么插件自己选。
Download Caddycaddyserver.com但是下载下来之后就是不能用,只闪退。
后来又找了一个github的版本,这个下载下来居然是能用的,打开之后命令行界面一直停着,根据教程也能出现404页面。
https://github.com/caddyserver/caddygithub.com不是吧,v2还没v1好用?
用v1呗?可是里面没说加了webdav插件啊?
那之后再加?搜索加载插件的方法,最多的答案是从官网下载的时候就勾选好插件。
这,这,这……第一天就这么过去了。
2、再会apache
晚上在家的时候我就在想,我本本上需要的不过是一个服务器架设软件。caddy提供的功能如此,nextcloud提供的是如此,那什么可道云、群晖,也是如此。
那可不可以用apache来做?它不至于不做windows版本,而且也不至于windows版本就把webdav这些东西去掉。
Windows下配置Apache服务器 - 航行 - 博客园www.cnblogs.com第二天,apache的配置过程异常简单。毕竟只要下载一个安装包,修改文件的过程也是在macbook上实操过的。windows启动apache更简单明了,可以直接去服务列表启动。
不过二者的httpd.conf文件确实有略微差别。
再搜索一篇配置webdav的帖子。
Apache 2.2.x 配置WebDAVwww.yiibai.com为了保持一致性,我把webdav服务器搬到了htdocs文件夹下面,作为apache服务器的子目录。上传文件的位置自然也是uploads。
另外需要注意的是用cmd执行htdigest -c "%APACHE_INSTALLED_PATH%/user.passwd" DAV-upload admin命令前,需要把目录先cd到apache文件夹下的bin文件夹位置,不然会反馈找不到这个命令。看来bin文件夹里有很多功能文件。
博文推荐的BitKinex一点也不含糊,很顺利地完成了测试webdav服务器的功能。可以在win7本本上访问127.0.0.1/uploads文件夹了。
3、恼人的405
我没有急着拆包网购的路由器,先用手机热点使macbook和win7本本联网。然后试着访问,查到win7的对外IP地址(当然是自动分配的浮动ip),改成该ip下的uploads文件夹,用macbook上的浏览器可以访问成功!
这表明服务器搭建ok,是可以通过联网访问的。
不过代码改完ip之后,用ipad模拟器测试,上传还是失败,提示:
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed.
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed using AFNetworkingstackoverflow.com把3840这个error修复掉其实有很多种方法,stackoverflow里介绍可能的是返回数据里存在较多Fragments,建议用NSJSONReadingAllowFragments修复。但我推测更可能的原因是windows搭建的webdav服务器并没有返回JSON格式的数据,所以用
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
也会报3840的错误。
如果按视频教程的方法设置manager.responseSerializer为AFHTTPRequestSerializer可能更好一点。反正我的目的是用PUT方法上传文件即可,拿到服务器返回的二进制数据也不需要解析。
但接下来的报错就很麻烦了:
Error Domain=AFNetworkingErrorDomain Code=-1011 “Request failed: method not allowed (405)”
method not allowed,PUT方法不被接受!?我配置好了webdav呀!macbook更新系统后也运行的好好的呀。
看来,其中还是存在一些问题,介于搜到的大多数答案都认为是服务器的问题,我拿BitKinex试了下直接拖拽上传到uploads,果不其然地报错了。也是put方式不被接受,服务器返回数据里明确指出了允许的方法包含GET POST OPTIONS HEAD等,但是没有PUT和DELETE
怎么让apache重新支持PUT方法?中文博客大多让你改httpd.conf文件,
其中有一段
<Directory "/var/www/html/doc">
Dav On
AllowOverride None
Options All
Order allow,deny
Allow from all
</Directory>
只要加上Order allow,deny或者Allow from all
开启apache服务时就会报错,如果不加,则没有任何效果,还是不支持PUT。
一些建议我去看文档的,比如增加
<LimitExcept GET OPTIONS>
require user admin
</LimitExcept>
之类的,也没有任何效果。(这东西httpd.conf里没有,但httpd-dav.conf里有,不过我在GET后面加了POST也没啥效果)
stackoverflow没啥有营养的东西,比如这篇
How to enable and use HTTP PUT and DELETE with Apache2 and PHP?stackoverflow.com就是让你放弃PUT,采用更安全的编写网络端php脚本的方式用POST实现上传。
没啥意义,PUT安不安全不是我现阶段考虑的事。
后来我找到了一篇可能是众多方案老祖宗的博文。
上传文件之PUT方法上传(服务器配置不当)_千寻的博客-CSDN博客_put上传文件blog.csdn.net它提到Directory代码块里面,只需要添加一句DAV On即可。
但我的apache版本里除了Require all granted和AllowOverride None,其它都没有。
试试把这一句添加到最后,其它不管?
重新启用apache服务,成功!使用BitKinex拖拽上传,成功!
(开启文件锁那一步我没删,估计也是起到作用的)
最后用模拟器调试代码,也成功了!
成功了!
真的成功了!
我掏出网购的路由器,设置好无线网络。再连接win7本本和macbook,貌似会自动给我俩机子分配192.168.1.102开始往后的ip地址。之后的测试跟前面一样,也很顺利。看来我的app离完成不远了。
阿帕奇,永远滴神!