众所周知,用curl上传只要设置4个变量即可(非HTTPS网站),那就是curlopt_url,curlopt_post,curlopt_returntransfer,curlopt_postfields,当然这4个都是大写。
curlopt_post,curlopt_returntransfer 都是 true,curlopt_url则是你要提交的网址,那么剩下的,curlopt_postfields就是你要上传的内容了。
上传文件在这里也变得非常简单,只需对应的值前面加个“@”即可,如curl_setopt($ch,CURLOPT_POSTFIELDS,array('file'=>'@/var/www/images/abc.jpg')); 文件通过realpath判断后存在的即可。
但是,这一切在php5.6里就发生了改成。php5.6不再支持@这样的上传方式,只能使用curl_file_create的方式来,所以上面的代码要改成
PHP代码
- curl_setopt($ch,CURLOPT_POSTFIELDS,array('file'=>curl_file_create('/var/www/images/abc.jpg','image/jpg','abc')));
看看文档里怎么说:
XML/HTML代码
- CURLFile should be used to upload a file with CURLOPT_POSTFIELDS.
然后官网的手册中的最后一条评论,仿佛是看不下去,写了个处理上传的程序
PHP代码
- There are "@" issue on multipart POST requests.
-
- Solution for PHP 5.5 or later:
- - Enable CURLOPT_SAFE_UPLOAD.
- - Use CURLFile instead of "@".
-
- Solution for PHP 5.4 or earlier:
- - Build up multipart content body by youself.
- - Change "Content-Type" header by yourself.
-
- The following snippet will help you :D
-
- <?php
-
-
-
-
-
-
-
-
-
- function curl_custom_postfields($ch, array $assoc = array(), array $files = array()) {
-
-
- static $disallow = array("\0", "\"", "\r", "\n");
-
-
- foreach ($assoc as $k => $v) {
- $k = str_replace($disallow, "_", $k);
- $body[] = implode("\r\n", array(
- "Content-Disposition: form-data; name=\"{$k}\"",
- "",
- filter_var($v),
- ));
- }
-
-
- foreach ($files as $k => $v) {
- switch (true) {
- case false === $v = realpath(filter_var($v)):
- case !is_file($v):
- case !is_readable($v):
- continue;
- }
- $data = file_get_contents($v);
- $v = call_user_func("end", explode(DIRECTORY_SEPARATOR, $v));
- $k = str_replace($disallow, "_", $k);
- $v = str_replace($disallow, "_", $v);
- $body[] = implode("\r\n", array(
- "Content-Disposition: form-data; name=\"{$k}\"; filename=\"{$v}\"",
- "Content-Type: application/octet-stream",
- "",
- $data,
- ));
- }
-
-
- do {
- $boundary = "---------------------" . md5(mt_rand() . microtime());
- } while (preg_grep("/{$boundary}/", $body));
-
-
- array_walk($body, function (&$part) use ($boundary) {
- $part = "--{$boundary}\r\n{$part}";
- });
-
-
- $body[] = "--{$boundary}--";
- $body[] = "";
-
-
- return @curl_setopt_array($ch, array(
- CURLOPT_POST => true,
- CURLOPT_POSTFIELDS => implode("\r\n", $body),
- CURLOPT_HTTPHEADER => array(
- "Expect: 100-continue",
- "Content-Type: multipart/form-data; boundary={$boundary}",
- ),
- ));
- }
好吧,其实多文件上传用这样的方式就挺好。
现在写PHP好象不用Composer总感觉有点Low了吧?好吧,即使这样,你在使用composer update的时候是不是也发现网速、进度low的不行。一个composer update要等半天。不说这个吧,你就是一个composer init也要等半天,这只是个空项目,你都要等这么久?composer 如果不加-vvv参数,你就感觉整个世界都停在那里了。所以,如果连接原始的composer还是加个-vvv参数吧
国内常见镜像有三个:
XML/HTML代码
- http://pkg.phpcomposer.com/
- https://toran.reimu.io/
- http://packagist.cn/
使用方法很简单一种是在~/.composer/config.json中加入相应的信息,一种是在当前项目的composer.json中加入:
JavaScript代码
- "repositories": [
- {"type": "composer", "url": "http://pkg.phpcomposer.com/repo/packagist/"},
- {"packagist": false}
- ]
加入的时候注意语法,如果是json的最后一个元素,记得不要加","即可,否则 会报错
OK这样就可以了,尽情的尝试吧(packagist.cn更新的有点慢,toran.reimu.io 是https的,如果你本机openssl版本低可能会更新失败)。好象话这么一说,只能用pkg.phpcomposer.com的源了(嗯,忍忍吧,如果他不能用,你再换)
更新:composer 源
鉴于机器有点慢,所以决定 将光驱换成SSD。并将系统移到了SSD上,然后让人纠结的事情就发生了。如果不动机器纯待机,一天一夜20%的电,去年国庆的时候,将mac带回来。5天没动。回上海后发现居然自动关机了~~~
那时候就在想为什么会这么耗电,想来想去可能是因为待机的时候SSD供电无法关闭(看资料是说mac在待机的时候,会将部分设备的电源关闭的,比如光驱,现在我的系统在光驱位上,那一定断不了电)
但一直没时间折腾它,前段时间终于想到了,还是折腾一下吧。于是将SSD硬盘换到主硬盘位,原来的硬盘放到了光区位。周五下班后,电脑就一直没开。周一早上开,还有91%的电。感觉省下了不少啊~~(rmbp的时候2天只有2%的电,我忍了~)
-----------
顺便问问如果有人有兴趣,我想出掉现在的这台电脑以及一台mac air
1、Macbook Air 11寸 港版,8G内存定制版,硬盘SSD 128G 。实际使用不满100小时, 5000 出(不含快递费)去年6月买的,应该是13款,14款是快年底才有的
2、Macbook Pro 13 ,2012款年中版,i5 CPU,原4G内存升到16G,原500G硬盘升级成(SSD+500)【SSD是Intel 250G的,买的时候京东价1300,现价1100,http://item.jd.com/1011784.html】,6000出 这个就是我现在在用的
鉴于我每次安装win7都是在用bootcamp的情况下,随之而来带来的问题就是,只有一个分区,这让我很苦恼。所以到最后我往往都是直接用虚拟机算了。
本文来自CU,本人目前没有测试过,先备着,万一哪天我又心血来潮了,我就用它来试一下(原文来自:http://bbs.chinaunix.net/thread-4166135-1-1.html)
本帖最后由 xinyv 于 2015-01-12 12:15 编辑
2015年元旦macbook air 安装记录
目的:
1、air 安装双系统 Yosemite + win7
2、win7 多分区
3、单U盘安装
准备:
16G U盘一个usb3.0
制作安装U盘:
1、下载最新的 MacOS Yosemite 10.10.1, win7sp1
下载yosemite必须用 mac app store 下载,我下载的版本
yosemite 10.10.1 md5:e37ac9e9c79de428529c6933419ee5ff
win7sp1_x64.iso md5:480b62c3acd6c8a36b18d9e906cd90d2
2、制作 win7 安装盘
打开 Launchpad -> 其他 -> Boot Camp 助理,点击继续,选择创建 Windows 7 或更高版本的安装盘 和 从 Apple下载最新的Windows 支持软件,点击继续,选取你的 win7 的iso镜像,然后点继续,速度快慢就看你的网速是否给力了。
制作完之后,找另一个 windows 系统,插上 U盘,在硬盘上新建一个文件夹,把U盘里面所有的文件都拷贝进去,这时候,你可以用U盘引导一下air 试试,(插入U盘,启动的时候按 option,选择WININSTALL)你会发现键盘鼠标都不能用,查资料是因为新款air使用了usb3.0 win7默认没有驱动
安装驱动,参考链接 http://bbs.feng.com/read-htm-tid-8541291.html
安装驱动其实就是编辑 boot.win 和 install.win 这两个文件
创建二个文件夹m1、m2 用来 mount上面的两个文件 (cmd 命令)
然后从刚才的备份中挂载 boot.win 和 install.win 我备份的目录是 D:\uu
XML/HTML代码
- dism /mount-wim /wimfile:d:\uu\source\boot.wim /index:2 /mountdir:m1
- dism /mount-wim /wimfile:d:\uu\sources\install.wim /index:4 /mountdir:m2
添加usb3.0驱动
XML/HTML代码
- dism /image:m1 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\xHCI\Win7\x64\iusb3hub.inf
-
- dism /image:m2 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\xHCI\Win7\x64\iusb3hub.inf
-
- dism /image:m1 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\xHCI\Win7\x64\iusb3xhc.inf
-
- dism /image:m2 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\xHCI\Win7\x64\iusb3xhc.inf
-
- dism /image:m1 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\HCSwitch\Win7\x64\iusb3hcs.inf
-
- dism /image:m2 /add-driver /driver:d:\uu\$WinPEDriver$\IntelxHCISetup\Drivers\HCSwitch\Win7\x64\iusb3hcs.inf
提交修改,umount 文件
XML/HTML代码
- dism /unmount-wim /mountdir:m1 /commit
- dism /unmount-wim /mountdir:m2 /commit
- rmdir m1 m2
把 U 盘卸载,重新插到 air 上面
3、制作 air 安装U盘
打开 Launchpad -> 其他 -> 磁盘工具,把U盘的信息全部抹掉,包括默认分区也要删除,然后重新创建U盘分区,创建的时候选择主引导记录,分两个区,第一个是 win_setup文件系统类型选 exfat,第二个选 MacOS 日志文件系统,第一个一定要是 windows 分区
参考链接:http://bbs.feng.com/read-htm-tid-2628649.html
以前直接用下载的 dmg 制作就可以,新版系统的制作方式已经变化了
打开Finder-应用程序,找到安装OS X Yosemite,右键-显示包内容,依次点开Contents-SharedSupport文件夹,你会发现一个InstallESD的DMG文件,双击打开这个文件,你会看到一个文件夹 Packages
下面打开终端输入
XML/HTML代码
- defaults write com.apple.finder AppleShowAllFile -bool true
- killall Finder
如果这条命令提示错误,你可以把后面的 -bool true 改成 YES,实在不行就 man 一下
执行成功以后在看看刚才那个文件夹,多出了几个隐藏文件 BaseSystem.dmg
打开 Launchpad -> 其他 -> 磁盘工具,选择 u 盘,选恢复
把左侧的 u 盘拖到目标盘那里,把刚才我们看到的隐藏文件 BaseSystem.dmg 拖到源磁盘那里,然后点恢复。恢复完成以后,把 BaseSystem.dmg 和 BaseSystem.chunklist 拷贝到 u 盘苹果系统分区的根目录里面,然后进入 System\Installation 删除 Packages 这个链接,把 InstallESD 下面的 Packages 文件夹拷贝到这里来。拷贝 BaseSystem 哪两个文件不能省略,省略之后引导系统的时候会提示 undefined error 0
把系统文件在恢复隐藏
XML/HTML代码
- defaults write com.apple.finder AppleShowAllFile -bool false
- killall Finder
到此 Yosemite 的安装盘制作完成,我发现在 air 上按照上面的方法制作都可以成功,但在 pro 上制作安装盘失败。原因还没有找到
参考链接:http://mac-how-to.wonderhowto.co ... 0-yosemite-0155306/
4、多系统安装盘制作
把刚才制做好的 U盘插到刚才我们备份的 win系统上,利用 Windows7-USB-DVD-Download-Tool 工具和 win7 iso 创建一个win 安装 U盘,使用第一个我们预留的分区,制作完成以后,拷贝刚才我们备份的 uu 下的所有文件,直接覆盖进 u盘的 win 分区。拷贝完数据,安装盘就制作完成了。下面就是安装系统了。
5、安装系统
因最前面有一个 200M 的 efi 分区,最后又有一个 Recovery 分区,在加上苹果系统自己占用的一个分区,win7 就只剩下一个分区了,网上说的总总办法,比如删除 Recovery,扩展那个 efi 分区,在10.10.1 上测试均有问题,不是 mac 系统找不到就是 win7 起不来,经多多次测试,发现一个折中的方案
在重装系统的时候,直接提前分区,我分了 三个区,
第一区 WinOS
第二区 data
第三区 MacOS
这么分区的原因是 win7 会在最前面放一个 200 M的 efi,MacOS 会在最后面放一个 Recovery,这样前后都有系统分区把数据分区和功能分区隔离开,不容易损坏,分区之后用U盘引导,先安装 Yosemite,安装在最后一个分区,安装完以后在重新引导安装 win7,这时候你会发现 Recovery 被挤出了主分区表,Win7 看到的是未分配空间,不用搭理他,反正不是给你win7 用的,不认识就不认识吧,然后安装win7,安装 boot camp。安装好以后你会发现虽然 win7不认识,然这并不影响mac系统,启动的时候按 option ,你就会发现Recovery 仍旧是可以使用的,而且因为他被挤出去的原因,我们现在又多了一个分区名额,你可以增加一个扩展分区,然后在分若干个盘了。
至此,air就安装完了,我们保留了所有默认分区,而且 win7 支持多分区,单U盘安装双系统,多分区目的完成
最近在大卫的指点下开始摸Java了。但我其实更擅长的是PHP,所以现在就开始混用了,那混用的最佳搭配是resin(其实apache+resin插件也OK)。不过纯resin的话也就意味着可以直接混用java的数据了。而不是采用接口调用的方式。
在mac下安装resin是有点麻烦的,官方的教程就几句话,参考 :http://www.caucho.com/resin-4.0/admin/starting-resin-install.xtp,
XML/HTML代码
- Next we'll change into the Resin directory we just unpacked to configure and build the server. The Java portions of Resin are already compiled, but this step will build additional C-based components of Resin that provide additional functionality such as:
-
- A faster IO library, including massive keepalive support *
- Support for OpenSSL *
- The ability to run as a non-priviledged user for security
- Connector modules for Apache
- (* only available in Resin Professional)
然后官方的文档就提示你,configure一下就OK了。不过解开压缩包发现,configure没有可执行权限,只能先chmod +x ./configure。
我第一次是按照官方的例子来的,即:
XML/HTML代码
- ./configure --prefix=/usr/local/share/resin \
- --with-resin-root=/var/resin \
- --with-resin-log=/var/log/resin \
- --with-resin-conf=/etc/resin
但后面在运行的时候,一会提示log文件写不了,一会提示app目录不能创建,虽然chown改了权限 后就OK了,但总是有点小问题。去网上找了一下,发现了:http://www.cnblogs.com/jmtbai/p/4394424.html,它在内容里就有说:
XML/HTML代码
- ./configure -prefix=/Users/emma/Documents/workspace/resin-pro-4.0.43 -enable-64bit-jni
-
- /Users/emma/Documents/workspace/resin-pro-4.0.43为最终resin被安装的目录,这个目录需要指定,不然默认就是/var/share/resin下,这个读resin.xml文件时会有问题
果然我把prefix改成我的路径就OK了。(上面的-prefix是不对的,是--prefix)。
顺利的将项目运行了起来,同时写了个test.php,居然也OK了。(现在是知其然不知其所以然,先用起来再说了)