PHPExcel操作sae的storage上的文件
在用PHPexcel操作excel的时候,在本地是好使的,但是把代码部署到sae就不好使了。会遇到如下问题:
文件的操作被拒绝。
这个原因就是sae上的应用文件是不允许改动的。sae提供的文件方案是使用storage,所以可以把文件存储在storage来进行操作。
具体解决可以如下:
我在sae应用里新建一个domain域files(这个名字必须是小写字母或数字,如果是大写字母的话虽然可以在Cyberduck上新建成功,在domain管理里看到,但是是无效的domain)。在这个files下新建文件夹Files,然后把要操作的excel上传。
如上。
我对excel的操作代码如下:
1 $file_name="Files/info.xls"; 2 3 $objPHPExcel=PHPExcel_IOFactory::load($file_name); 4 5 $objPHPExcel->setActiveSheetIndex(0); 6 7 $row=$objPHPExcel->getActiveSheet()->getHighestRow()+1; 8 9 $objPHPExcel->getActiveSheet()->SetCellValue('A'.$row,$_POST['inputName']); 10 11 $objPHPExcel->getActiveSheet()->SetCellValue('B'.$row,$_POST['inputClass']); 12 13 $objPHPExcel->getActiveSheet()->SetCellValue('C'.$row,$_POST['inputEmail']); 14 15 $objPHPExcel->getActiveSheet()->SetCellValue('D'.$row,$_POST['inputJob']); 16 17 $objPHPExcel->getActiveSheet()->SetCellValue('E'.$row,$_POST['inputTel']); 18 19 $objWriter=newPHPExcel_Writer_Excel5($objPHPExcel); 20 21 $objWriter->save($file_name);
执行的是在info.xls的末尾添加一行。
修改之后的代码如下;
1 $file_name='saestor://files/Files/info.xls'; 2 3 $objPHPExcel=PHPExcel_IOFactory::load($file_name); 4 5 $objPHPExcel->setActiveSheetIndex(0); 6 7 $row=$objPHPExcel->getActiveSheet()->getHighestRow()+1; 8 9 $objPHPExcel->getActiveSheet()->SetCellValue('A'.$row,$_POST['inputName']); 10 11 $objPHPExcel->getActiveSheet()->SetCellValue('B'.$row,$_POST['inputClass']); 12 13 $objPHPExcel->getActiveSheet()->SetCellValue('C'.$row,$_POST['inputEmail']); 14 15 $objPHPExcel->getActiveSheet()->SetCellValue('D'.$row,$_POST['inputJob']); 16 17 $objPHPExcel->getActiveSheet()->SetCellValue('E'.$row,$_POST['inputTel']); 18 19 $objWriter=newPHPExcel_Writer_Excel5($objPHPExcel); 20 21 $objWriter->save($file_name);
可以看到,修改的只是文件路径。然后操作就完全没有问题了。
问题解决了,接下来我要扯扯怎么找到的办法。
刚开始说要用storage,好,我就去sae官网看storage文档,结果,说的什么鬼,没有收获。
毕竟我要找的重点是storage文件的存储路径,文档里说的是整个元素级的处理。
只有一句:
这个还是在介绍文档里说的。
既然如此,我就先上传文件来试试呗。域和文件结构已建好。代码参考:http://cloudbbs.org/forum.php?mod=viewthread&tid=23708里的7楼作者回答。
上传文件代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <metacharset="UTF-8"/> 2 3 <formaction=""method="post"enctype="multipart/form-data"> 4 5 <inputtype="file"name="file"/> 6 7 <inputtype="submit"/> 8 9 </form> 10 11 <?php 12 13 if($_FILES['file']!='') 14 15 { 16 17 $storage=newSaeStorage(); 18 19 $domain='files'; 20 21 $dest='Files/'.$_FILES['file']['name']; 22 23 $src=$_FILES["file"]["tmp_name"]; 24 25 $storage->upload($domain,$dest,$src); 26 27 $url=$storage->getUrl($domain,$dest); 28 29 echo"网址:$url<br/><imgsrc='$url'/>"; 30 31 } 32 33 34 ?>
可以看到返回的地址是:http://dutcircle-files.stor.sinaapp.com/Files/实验.png
在应用管理里也可以看到文件是已经上传好了的。
再尝试打开下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <metacharset="UTF-8"/> 2 3 <formaction=""method="post"> 4 5 <inputtype="text"name="text"/> 6 7 <inputtype="submit"/> 8 9 </form> 10 11 <?php 12 13 if($_POST['text']!='') 14 15 { 16 17 $storage=newSaeStorage(); 18 19 $domain='files'; 20 21 $dest='Files/'.$_POST['text']; 22 23 $url=$storage->getUrl($domain,$dest); 24 25 echo"网址:$url<br/><imgsrc='$url'/>"; 26 27 }
可以看到,可以通过这个url来获取文件。
但是,直接把这个url用来操作excel,
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $objExcel=newPHPExcel(); 2 3 $storage=newSaeStorage(); 4 5 $domain='files'; 6 7 $dest='Files/info.xls'; 8 9 $url=$storage->getUrl($domain,$dest); 10 11 $file_name=$url; 12 13 //http://dutcircle-files.stor.sinaapp.com/Files/info.xls 14 15 $file_name='saestor://files/Files/info.xls'; 16 17 $objPHPExcel=PHPExcel_IOFactory::load($file_name);
是不对的,会报错,找不到这个文件。
所以得换个方法,http://saebbs.com/forum.php?mod=viewthread&tid=9456
虽然提的问题和我不一样,但人家已经解决了我的问题。
修改代码,至此,大功告成。