Code our life 日日行,不怕千万里;时时学,不怕千万卷

22七/100

使用imageMagic实现PDF转图片

最近一个项目需要实现将PDF文件转成图片的功能,由于转换时间较长,所以选择在系统后台执行转换工作,使用的是一个叫imageMagic的程序(貌似很多图片处理软件用的就是这个库)。查看imageMagic的官方文档,参数实在太多,做了一番research之后,记录如下:

PDF转图片

convert -density 300 -quality 100 -resize 1024x768 -antialias test.pdf[0-50] test.jpg

使用convert命令进行转换:
density参数是设置图片DPI值
quality参数是设置图片质量(0-100,对png格式图片无效)
resize参数是对图片进行缩放(按比例)
antialias参数是设置开启文字抗锯齿效果
test.pdf是要转换的pdf文件(必要时需要指定绝对路径,不一定是pdf格式,图片格式即可,0-50是指要转换的页码,不指定就全部转换)
test.jpg是转成图片后的名字(如果pdf有多页,图片名称按照 test-0.jpg, test-1.jpg, test-2如此类推)

PHP中调用convert命令

PHP中有几个调用系统shell命令的函数,这次项目中我使用exec这个函数,使用方法如下:

    $cmd = "convert -density 300 -quality 100 -resize 1024x768 -antialias test.pdf[0-50] test.jpg";
    // $output变量记录命令执行时的所有输出,以数组格式返回
    // 执行后可以对$output变量进行检查,因为convert命令正常的话是没有输出的,如果有输出可能就是转换失败
    exec($cmd, $output);

解析PDF等图片的信息

可以使用identify命令对PDF进行解析,可以得到文件的分辨率等信息,简单命令如下(详细参数参考官方文档):
identify test.pdf

解决在IE下jpg图片无法显示的问题

因为imageMagic转换成jpg格式图片的时候,默认使用了CMYK格式,所以导致在IE下有时候会显示不了。
可以使用colorspace参数将图片使用RGB的格式进行转换。
命令如下:
convert -colorspace RGB test.pdf test.jpg

20七/100

【翻译】多文件上传

多文件上传

多文件上传

以往我打算是实现同时上传多个文件,会使用多个"file"表单元素,这是令人讨厌的,效率低下(译者注:用户需要一个文件一个文件地选择),但我无法想象我如果不使用它的话,我的用户会怎么样。很幸运,Safari, Chrome和firefox 现在已经实现了使用一个file表单元素就能完成完成多文件上传的方法。
查看DEMO

HTML


<form method="post" action="upload-page.php" enctype="multipart/form-data">
<!-- 译者注:注意這個multiple属性和name属性 -->
  <input name="filesToUpload[]" id="filesToUpload" type="file" multiple="" /> 
</form>
<br/>

简单的给file 表单元素添加一个muliple属性就允许多文件上传了。(译者注:multiple的值的作用不清楚,原文的意思大概是可以添加验证功能)

Listing Multiple Files with JavaScript

//get the input and UL list
var input = document.getElementById('filesToUpload');
var list = document.getElementById('fileList');
 
//清空列表
while (list.hasChildNodes()) {
	list.removeChild(ul.firstChild);
}
 
//遍历每一个选择上传的文件
for (var x = 0; x < input.files.length; x++) {
	//add to list
	var li = document.createElement('li');
	li.innerHTML = 'File ' + (x + 1) + ':  ' + input.files[x].name;
	list.append(li);
}

file表单元素的files属性是一个数组,所以可以通过length属性可以知道用户选择的文件。可以遍历得到每一个文件的路径(path)和名称(name)。

Receiving and Handling Files with PHP

使用PHP接收并处理文件

if(count($_FILES['uploads']['filesToUpload'])) {
	foreach ($_FILES['uploads']['filesToUpload'] as $file) {	    
                // 你可以在处理图片
		echo $file;		
	}
}

PHP根据表单的那么属性创建了一个文件数组。

当然,你也可以在IE和opera中通过flash实现多文件上传,可是想这样要另外的组件支持始终不是什么好主意。希望这些浏览器快点支持多文件上传吧!

by 译者

评论中以外发现一个flash上传的jquery插件http://www.uploadify.com/,这段时间在弄大文件上传的处理方式,是使用swfupload这个组件实现的。
记录一下这个uploadify, 以后也许用得着:)

13七/100

PHP中设置文件上传大小限制

PHP中有三个配置项是控制上传相关的:
memory_limit
post_max_size
upload_max_filesize
其中只有memory_limit可以在脚本中动设置

ini_set(‘memory_limit’, ‘60M’);          // 可成功设置
ini_set(‘post_max_size’, ‘40M’);        // 失败
ini_set(‘upload_max_filesize’, ‘40M’); // 失败

还可以通过.htaccess文件设置:
php_value memory_limit 60M
php_value post_max_size 40M
php_value upload_max_filesize 40M

当然,还可以直接php.ini中配置

28六/100

低版本的pathinfo不返回filename

客戶反映系統有一個奇怪的問題,調試之後發現在5.1x(客戶使用5.1.x,我們開發使用5.2.x)的php pathinfo不返回 filename。只好棄用pathinfo函數。
之前使用pathinfo函數是想獲得文件的 文件名和擴展名,改用如下方法:

    // $filePath = '/var/www/image/xxxx.png';
    list($filename, $ext) = explode('.', basename($filePath));

當然,這樣寫是有一定的局限性,當文件名是"foo.bar.png"時,這樣寫就發生錯誤。不過正式程式中的$filePath是程序生成的,所以能控制文件名,不會發生這樣的情況,就放心使用。

8六/100

php中clearstatcache function

定义和用法

clearstatcache() 函数清除文件状态缓存。

clearstatcache() 函数会缓存某些函数的返回信息,以便提供更高的性能。但是有时候,比如在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险 时,你需要清除文件状态缓存,以便获得正确的结果。要做到这一点,就需要使用 clearstatcache() 函数。

会进行缓存的函数,即受 clearstatcache() 函数影响的函数:

  • stat()
  • lstat()
  • file_exists()
  • is_writable()
  • is_readable()
  • is_executable()
  • is_file()
  • is_dir()
  • is_link()
  • filectime()
  • fileatime()
  • filemtime()
  • fileinode()
  • filegroup()
  • fileowner()
  • filesize()
  • filetype()
  • fileperms()

下面举个例子说明:

<?php
//检查文件大小
echo filesize("filesize.txt"),"<br/>"; //假设文件大小为123456,此时输出123456
 
$file = fopen("filesize.txt", "a+");
 
// 截取文件
ftruncate($file,100);
fclose($file);
echo filesize("filesize.txt"), "<br/>"; //输出的是缓存的结果,仍是123456
//清除缓存并再次检查文件大小
clearstatcache();
echo filesize("filesize.txt"), "<br/>"; // 因为清空的缓存,输出更新后的结果100
27五/100

cakephp中使用saveAll存储关联数据

1.设置好关联 hasMany or hasOn 2.提交的數據必須要符合cakephp要求的格式 3.调用saveAll的時候如果想要校驗關聯表字段的話,一定要在saveAll的第二個參數中添加 array('validate'=>'first') 4.編輯數據時,一定要設置ID,(關聯模型的和主模型都要設置)

5五/100

cakephp如何在controller中获取分页信息

controller的paginate方法用于获取符合条件的分页数据(一页的数据)。一般我们在view中使用这些数据配合分页helper进行数据处理。今天群里有朋友问如何在controller中获取数据的总条数而不用另外查询,查看了一下paginate的源代码,发现以下代码:

$paging = array(
    'page'	=&gt; $page,
 
    'current'	=&gt; count($results),
    'count'	=&gt; $count,
    'prevPage'	=&gt; ($page &gt; 1),
    'nextPage'	=&gt; ($count &gt; ($page * $limit)),
    'pageCount'	=&gt; $pageCount,
    'defaults'	=&gt; array_merge(array('limit' =&gt; 20, 'step' =&gt; 1), $defaults),
    'options'	=&gt; $options
 
);
 
$this-&gt;params['paging'][$object-&gt;alias] = $paging;

原来cake把分页相关信息放在了$this->params['paging']里面,其中$object->alias是model名,这阿姨那个我们就可以通过$this->params[‘paging’][‘modelName’][‘count’]获取总记录数了

22四/100

使用helper时指定文件路径

在使用 $html->css和$html->image时,例如$html->css('style'),cake会指向webroot\css目录下的style.css文件,同样$html->image('pic.png')会指向webroot\img\目录下的pic.png。

可是有时由于各种原因,我们的文件资源不一定放在CSS或者IMG等cake默认指向的文件夹下,比如我们要指向webroot\myimg目录下的mypic.png应该如何指向呢?

通过查看html helper的源码或者官方API文档可以看到这么一句注释:
If `$path` is prefixed with '/', the path will be relative to the webroot of your application.
Otherwise, the path will be relative to your CSS path, usually webroot/css.

这样一来,我们使用 $html->image('/myimg/mypic.png');就可以指向我们想要的图片。css等函数同理

24三/100

cakephp中定义flash的样式

公司要用cakephp开发项目,由于之前没有使用过cake,开发起来比较吃力。因为项目过紧,也就没有时间去慢慢系统的学习cake,只有一边学一边做。

今天就遇到了一个自定义flash信息的问题。一般我们在controller中使用setFlash()来设置信息内容:

    $this->setFlash('要现实的信息');

然后在view层使用flash()来显示。默认是生成一下的html

    <div class="message" id="flashMessage">要现实的信息</div>

可是今天wendy发来的模板上面包裹着显示信息的div有个class(不是默认的"message"),如何设置信息中的样式难住了我,google搜索相关资料都找不到解决方法。

最后只好硬着头皮看源码了,看了源码后才茅塞顿开,原来setFlash()就可以设置包裹信息的html元素!而这些api上应该是有说明的。
自定义flash样式代码如下:

    $this->setFlash('可以设置样式咯','default',array('class'=>'你自己的class'));

setFlash中的第二个参数是设置包裹信息的html元素,源码中默认是'defualt'(相当于div),如果要用其他元素,需要另外定义element模板。

PS:到新公司上班第三天了,感觉很好,公司的气氛很活跃。

11二/100

php中处理包含不存在文件的错误

最近自己写了一个轻量级的MVC框架,对于自动加载class这一功能只是简单地在入口文件使用__autoload来实现:

function __autoload($class) {
    include_once $class . '.php';	
}

简单测试没有什么问题,可是当加载不存在的class的时候,提示报错信息了。
如何在加载不存在的类的时候,使用自定义的错误报告呢?这可不是普通的if就能判断的。
想起前段时间看过的一个mvc框架(GoEz),源码中似乎实现了自动加载的机制。

打开GoEz的源码,看到了这么一段:

set_error_handler('errorHandler'));
include_once $fileName;
restore_error_handler();

google相关资料,廓然开朗

   下一页