上次写了一篇关于sys_get_temp_dir()实现错误,觉得写得不够,这次来举例说明使用自有域名访问BaeApp时导致的文件上传失败现象以及解决方案。
首先搭建一个测试demo:
<html> <body> <form action="index.php" method="post" enctype="multipart/form-data"> <label for="file">Filename:</label> <input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html> <?php include_once './krumo/class.krumo.php'; krumo($_FILES);
非常简单的一个文件上传页面,现在我们使用http://baesdkdemo.duapp.com/来访问它(我是Chrome用户,Chrome界面上的隐私太多不方便截图就临时用IE了),并且上传一个文件试试看:
非常好,上传成功了,可以看到临时路径和文件大小,错误码为0,也就是没有错误define ('UPLOAD_ERR_OK', 0);
下面给应用绑定一个自有域名demo.hankcs.com,并且上传相同的文件试试看:
出错了,错误码是6,也就是define ('UPLOAD_ERR_NO_TMP_DIR', 6);没有临时目录。说明什么?BAE的临时目录机制根本就是坑人用的,为什么不给其他域名的访问请求设置临时目录?这不就等于说自有域名的应用无法上传文件了吗?
其实我想出了一条“妙计”,那就是将post地址硬编码为duapp.com,也就是修改一句<form action="http://baesdkdemo.duapp.com/index.php" method="post"
之后就可以上传了,不过请注意浏览框的地址变成了baesdkdemo.duapp.com:
这跟第一张图可不一样,这是经由demo.hankcs.com跳转过去的,变相实现了自有域名的上传文件。
BAE可真是粗糙呀,这一刻我有了抛弃BAE转到SAE的想法,如果来访的朋友有什么好的意见欢迎留言。