nginx不浏览直接下载文件
发布时间:2021-06-16, 17:39:46 分类:Linux | 编辑 off 网址 | 辅助
正文 511字数 185,575阅读
如果nginx配置不对,就会造成部分文件,在浏览器中不是直接预览,而是进行了下载。修改的方法是修改配置文件。具体解决方法如下。
配置文件 nginx.conf
http {
include mime.types;
default_type application/octet-stream;
Run code
Cut to clipboard
这里主要有两行代码。
第一行: include mine.types 对应了文件的mime类型。
第二行: 默认的是octet-stream, 意思是如果一个文件的mime类型不存在就会使用默认的类型。 通常是这个导致了文件的下载。
解决方法:
将 default_type application/octet-stream; 修改为default_type text/html; 这样就默认表示一个文件是 html文件, 就可以在浏览器中查看。
修改后可能出现的问题
上面的方面可以解决文件不在浏览器中预览的情况,但是如果有文件的扩展名对应mime信息找不到,也会进行预览, 不管文件是不是文本文件,都是当成是文本文件。
nginx 默认的 mime 类型
文件mime.types
(支付宝)给作者钱财以资鼓励 (微信)→
有过 8 条评论 »
/* *功能:php完美实现下载远程图片保存到本地 *参数:文件url,保存文件目录,保存文件名称,使用的下载方式 *当保存文件名称为空时则使用远程文件原来的名称 */ function getImage($url,$save_dir='',$filename='',$type=0){ if(trim($url)==''){ return array('file_name'=>'','save_path'=>'','error'=>1); } if(trim($save_dir)==''){ $save_dir='./'; } if(trim($filename)==''){//保存文件名 $ext=strrchr($url,'.'); if($ext!='.gif'&&$ext!='.jpg'){ return array('file_name'=>'','save_path'=>'','error'=>3); } $filename=time().$ext; } if(0!==strrpos($save_dir,'/')){ $save_dir.='/'; } //创建保存目录 if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){ return array('file_name'=>'','save_path'=>'','error'=>5); } //获取远程文件所采用的方法 if($type){ $ch=curl_init(); $timeout=5; curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); $img=curl_exec($ch); curl_close($ch); }else{ ob_start(); readfile($url); $img=ob_get_contents(); ob_end_clean(); } //$size=strlen($img); //文件大小 $fp2=@fopen($save_dir.$filename,'a'); fwrite($fp2,$img); fclose($fp2); unset($img,$url); return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0); }
1.使用 curl
比如我们有下面这两张图片:
$images = [ 'https://dn-laravist.qbox.me/2015-09-22_00-17-06j.png', 'https://dn-laravist.qbox.me/2015-09-23_00-58-03j.png' ];
第一步,我们可以直接来使用最简单的代码实现:
function download($url, $path = 'images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); }
那在下载远程图片的时候就可以这样:
foreach ( $images as $url ) { download($url); }
2.封装一个类
缕清思路之后,我们可以将这个基本的功能封装到一个类中:
class Spider { public function downloadImage($url, $path = 'images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); } }
在者,我们还可以这样稍微优化一下:
public function downloadImage($url, $path='images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $this->saveAsImage($url, $file, $path); } private function saveAsImage($url, $file, $path) { $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); }
封装成类之后,我们可以这样调用代码来下载图片:
$spider = new Spider(); foreach ( $images as $url ) { $spider->downloadImage($url); }
生成文字水印
//文字水印 /*打开图片*/ //1.配置图片路径 $src = "4.jpg"; //2.获取图片的信息(得到图片的基本信息) $info = getimagesize($src ); //3.通过获取图片类型 $type = image_type_to_extension($info[2],false); //4.在内存中创建一个图片类型一样的图像 $fun = "imagecreatefrom{$type}"; //5.图片复制到内存中 $image = $fun($src); /*操作图片*/ //1.设置字体的路径 $font = "STLITI.TTF";//c盘windows/fonts //2.填写水印内容 $content = '你好'; //3.设置字体的颜色rgb和透明度 $col = imagecolorallocatealpha($image,255,255,255,50); //4.写入文字 imagettftext($image,20,0,20,30,$col,$font,$content); /*输出图片*/ //浏览器输出 header("Content-type:{$info['mime']}"); $func = "image{$type}"; $func($image); //保存图片 $func($image,'newimage.'.$type); /*销毁图片*/ imagedestroy($image);
生成图片水印
$dst_path = '4.jpg'; $src_path = '1.png'; //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dst_path)); $src = imagecreatefromstring(file_get_contents($src_path)); //获取水印图片的宽高 list($src_w, $src_h) = getimagesize($src_path); //将水印图片复制到目标图片上,最后个参数80是设置透明度,这里实现半透明效果 imagecopymerge($dst, $src, 10, 10, 0, 0, $src_w, $src_h, 80); //如果水印图片本身带透明色,则使用imagecopy方法 //imagecopy($dst, $src, 10, 10, 0, 0, $src_w, $src_h); //输出图片 list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path); switch ($dst_type) { case 1://GIF header('Content-Type: image/gif'); imagegif($dst); break; case 2://JPG header('Content-Type: image/jpeg'); imagejpeg($dst); break; case 3://PNG header('Content-Type: image/png'); imagepng($dst); break; default: break; } imagedestroy($dst); imagedestroy($src);
<?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecolorallocate($image, 22, 153, 0); //3. 使用绿色填充画布 imagefill($image, 0, 0, $green); //4. 在画布中绘制图像 $bai = imagecolorallocate($image, 255, 255, 255); //使用指定的字体文件绘制文字 //参数2:字体大小 //参数3:字体倾斜的角度 //参数4、5:文字的x、y坐标 //参数6:文字的颜色 //参数7:字体文件 //参数8:绘制的文字 imagettftext($image, 30, 30, 200, 250, $bai, 'STHUPO.TTF', 'helloworld'); //5. 在浏览器直接输出图像资源 header("Content-Type:image/jpeg"); imagejpeg($image); //6. 销毁图像资源 imagedestroy($image);
在访问php时生成txt文件
$filename = 'file.text'; //也可以是其他后缀格式的 $ua = $_SERVER["HTTP_USER_AGENT"]; foreach ($fedexinfo as $key => $value) { echo $key.",\"".$value."\"\r\n"; } header("Content-Type: application/octet-stream"); header('Content-Disposition: attachment; filename="' . $filename . '"');
php中裁剪图片主要使用gd库的imagecopyresampled方法 $src_path = '1.jpg'; //创建源图的实例 $src = imagecreatefromstring(file_get_contents($src_path)); //裁剪开区域左上角的点的坐标 $x = 100; $y = 12; //裁剪区域的宽和高 $width = 200; $height = 200; //最终保存成图片的宽和高,和源要等比例,否则会变形 $final_width = 100; $final_height = round($final_width * $height / $width); //将裁剪区域复制到新图片上,并根据源和目标的宽高进行缩放或者拉升 $new_image = imagecreatetruecolor($final_width, $final_height); imagecopyresampled($new_image, $src, 0, 0, $x, $y, $final_width, $final_height, $width, $height); //输出图片 header('Content-Type: image/jpeg'); imagejpeg($new_image); imagedestroy($src); imagedestroy($new_image);
<? header("Content-type: image/jpeg"); //原始图像 $dst = "images/flower_1.jpg"; //得到原始图片信息 $dst_im = imagecreatefromjpeg($dst); $dst_info = getimagesize($dst); //水印图像 $src = "images/logo.gif"; $src_im = imagecreatefromgif($src); $src_info = getimagesize($src); //水印透明度 $alpha = 30; //合并水印图片 imagecopymerge($dst_im,$src_im,$dst_info[0]-$src_info[0],$dst_info[1]-$src_info[1],0,0,$src_info[0], $src_info[1],$alpha); //输出合并后水印图片 imagejpeg($dst_im); imagedestroy($dst_im); imagedestroy($src_im); ?>
/* * 图片裁剪工具 * 将指定文件裁剪成正方形 * 以中心为起始向四周裁剪 * @param $src_path string 源文件地址 * @param $des_path string 保存文件地址 * @param $des_w double 目标图片宽度 * */ function img_cut_square($src_path,$des_path,$des_w=100){ $img_info = getimagesize($src_path);//获取原图像尺寸信息 $img_width = $img_info[0];//原图宽度 $img_height = $img_info[1];//原图高度 $img_type = $img_info[2];//图片类型 1 为 GIF 格式、 2 为 JPEG/JPG 格式、3 为 PNG 格式 if($img_type != 2 && $img_type != 3) return ; /*计算缩放尺寸*/ if($img_height > $img_width){ $scale_width = $des_w;//缩放宽度 $scale_height = round($des_w / $img_width * $img_height);//缩放高度 $src_y = round(($scale_height - $des_w)/2); $src_x = 0; }else{ $scale_height = $des_w; $scale_width = round($des_w / $img_height * $img_width); $src_y = 0; $src_x = round(($scale_width - $des_w)/2); } $dst_ims = imagecreatetruecolor($scale_width, $scale_height);//创建真彩画布 $white = imagecolorallocate($dst_ims, 255, 255, 255); imagefill($dst_ims, 0, 0, $white); if($img_type == 2){ $src_im = @imagecreatefromjpeg($src_path);//读取原图像 }else if($img_type == 3){ $src_im = @imagecreatefrompng($src_path);//读取原图像 } imagecopyresized($dst_ims, $src_im, 0, 0 ,0, 0 , $scale_width , $scale_height , $img_width,$img_height);//缩放图片到指定尺寸 $dst_im = imagecreatetruecolor($des_w, $des_w); // $white = imagecolorallocate($dst_im, 255, 255, 255); // imagefill($dst_im, 0, 0, $white); imagecopy($dst_im, $dst_ims, 0, 0, $src_x, $src_y, $des_w, $des_w);//开始裁剪图片为正方形 // imagecopyresampled($dst_im, $src_im, $src_x, $src_y, 0, 0, $real_width, $real_width,$img_width,$img_height); if($img_type == 2) { imagejpeg($dst_im, $des_path);//保存到文件 }else if($img_type == 3){ imagepng($dst_im,$des_path); } // imagejpeg($dst_im);//输出到浏览器 imagedestroy($dst_im); imagedestroy($dst_ims); imagedestroy($src_im); }
//1.配置图片路径 $src = "1.jpg"; //2.获取图片信息 $info = getimagesize($src); //3.通过编号获取图像类型 $type = image_type_to_extension($info[2],false); //4.在内存中创建和图像类型一样的图像 $fun = "imagecreatefrom".$type; //5.图片复制到内存 $image = $fun($src); /*操作图片*/ //1.设置字体的路径 $font = "simkai.ttf"; //2.填写水印内容 $content = "水印文字:some special words are supported."; //3.设置字体颜色和透明度 $color = imagecolorallocatealpha($image, 255, 255, 255, 0); //4.写入文字 (图片资源,字体大小,旋转角度,坐标x,坐标y,颜色,字体文件,内容) imagettftext($image, 30, 0, 100, 60, $color, $font, $content); /*输出图片*/ //浏览器输出 header("Content-type:".$info['mime']); $fun = "image".$type; $fun($image); //保存图片 $fun($image,'bg_res.'.$type); /*销毁图片*/ imagedestroy($image);
1: 面向过程的编写方法
//指定图片路径 $src = '001.png'; //获取图片信息 $info = getimagesize($src); //获取图片扩展名 $type = image_type_to_extension($info[2],false); //动态的把图片导入内存中 $fun = "imagecreatefrom{$type}"; $image = $fun('001.png'); //指定字体颜色 $col = imagecolorallocatealpha($image,255,255,255,50); //指定字体内容 $content = 'helloworld'; //给图片添加文字 imagestring($image,5,20,30,$content,$col); //指定输入类型 header('Content-type:'.$info['mime']); //动态的输出图片到浏览器中 $func = "image{$type}"; $func($image); //销毁图片 imagedestroy($image);
2:面向对象的实现方法
class Image_class { private $image; private $info; /** * @param $src:图片路径 * 加载图片到内存中 */ function __construct($src){ $info = getimagesize($src); $type = image_type_to_extension($info[2],false); $this -> info =$info; $this->info['type'] = $type; $fun = "imagecreatefrom" .$type; $this -> image = $fun($src); } /** * @param $fontsize: 字体大小 * @param $x: 字体在图片中的x位置 * @param $y: 字体在图片中的y位置 * @param $color: 字体的颜色是一个包含rgba的数组 * @param $text: 想要添加的内容 * 操作内存中的图片,给图片添加文字水印 */ public function fontMark($fontsize,$x,$y,$color,$text){ $col = imagecolorallocatealpha($this->image,$color[0],$color[1],$color[2],$color[3]); imagestring($this->image,$fontsize,$x,$y,$text,$col); } /* * 输出图片到浏览器中 */ public function show(){ header('content-type:' . $this -> info['mime']); $fun='image' . $this->info['type']; $fun($this->image); } /** * 销毁图片 */ function __destruct(){ imagedestroy($this->image); } } //对类的调用 $obj = new Image_class('001.png'); $obj->fontMark(20,20,30,array(255,255,255,60),'hello'); $obj->show();
3.支持以图片和文字两种方式给图片添加水印。图片支持GIF,PNG,JPG三种格式,水印图片支持PNG和GIF
function setWater($imgSrc,$markImg,$markText,$TextColor,$markPos,$fontType,$markType) { $srcInfo = @getimagesize($imgSrc); $srcImg_w = $srcInfo[0]; $srcImg_h = $srcInfo[1]; switch ($srcInfo[2]) { case 1: $srcim =imagecreatefromgif($imgSrc); break; case 2: $srcim =imagecreatefromjpeg($imgSrc); break; case 3: $srcim =imagecreatefrompng($imgSrc); break; default: die("不支持的图片文件类型"); exit; } if(!strcmp($markType,"img")) { if(!file_exists($markImg) || empty($markImg)) { return; } $markImgInfo = @getimagesize($markImg); $markImg_w = $markImgInfo[0]; $markImg_h = $markImgInfo[1]; if($srcImg_w < $markImg_w || $srcImg_h < $markImg_h) { return; } switch ($markImgInfo[2]) { case 1: $markim =imagecreatefromgif($markImg); break; case 2: $markim =imagecreatefromjpeg($markImg); break; case 3: $markim =imagecreatefrompng($markImg); break; default: die("不支持的水印图片文件类型"); exit; } $logow = $markImg_w; $logoh = $markImg_h; } if(!strcmp($markType,"text")) { $fontSize = 16; if(!empty($markText)) { if(!file_exists($fontType)) { return; } } else { return; } $box = @imagettfbbox($fontSize, 0, $fontType,$markText); $logow = max($box[2], $box[4]) - min($box[0], $box[6]); $logoh = max($box[1], $box[3]) - min($box[5], $box[7]); } if($markPos == 0) { $markPos = rand(1, 9); } switch($markPos) { case 1: $x = +5; $y = +5; break; case 2: $x = ($srcImg_w - $logow) / 2; $y = +5; break; case 3: $x = $srcImg_w - $logow - 5; $y = +15; break; case 4: $x = +5; $y = ($srcImg_h - $logoh) / 2; break; case 5: $x = ($srcImg_w - $logow) / 2; $y = ($srcImg_h - $logoh) / 2; break; case 6: $x = $srcImg_w - $logow - 5; $y = ($srcImg_h - $logoh) / 2; break; case 7: $x = +5; $y = $srcImg_h - $logoh - 5; break; case 8: $x = ($srcImg_w - $logow) / 2; $y = $srcImg_h - $logoh - 5; break; case 9: $x = $srcImg_w - $logow - 5; $y = $srcImg_h - $logoh -5; break; default: die("此位置不支持"); exit; } $dst_img = @imagecreatetruecolor($srcImg_w, $srcImg_h); imagecopy ( $dst_img, $srcim, 0, 0, 0, 0, $srcImg_w, $srcImg_h); if(!strcmp($markType,"img")) { imagecopy($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh); imagedestroy($markim); } if(!strcmp($markType,"text")) { $rgb = explode(',', $TextColor); $color = imagecolorallocate($dst_img, $rgb[0], $rgb[1], $rgb[2]); imagettftext($dst_img, $fontSize, 0, $x, $y, $color, $fontType,$markText); } switch ($srcInfo[2]) { case 1: imagegif($dst_img, $imgSrc); break; case 2: imagejpeg($dst_img, $imgSrc); break; case 3: imagepng($dst_img, $imgSrc); break; default: die("不支持的水印图片文件类型"); exit; } imagedestroy($dst_img); imagedestroy($srcim); }
参数说明:
$imgSrc:目标图片,可带相对目录地址, $markImg:水印图片,可带相对目录地址,支持PNG和GIF两种格式,如水印图片在执行文件mark目录下,可写成:mark/mark.gif $markText:给图片添加的水印文字 $TextColor:水印文字的字体颜色 $markPos:图片水印添加的位置,取值范围:0~9 0:随机位置,在1~8之间随机选取一个位置 1:顶部居左 2:顶部居中 3:顶部居右 4:左边居中 5:图片中心 6:右边居中 7:底部居左 8:底部居中 9:底部居右 $fontType:具体的字体库,可带相对目录地址 $markType:图片添加水印的方式,img代表以图片方式,text代表以文字方式添加水印
4.给图片加文字水印的方法
<?php /*给图片加文字水印的方法*/ $dst_path = 'http://f4.topitme.com/4/15/11/1166351597fe111154l.jpg'; $dst = imagecreatefromstring(file_get_contents($dst_path)); /*imagecreatefromstring()--从字符串中的图像流新建一个图像,返回一个图像标示符,其表达了从给定字符串得来的图像 图像格式将自动监测,只要php支持jpeg,png,gif,wbmp,gd2.*/ $font = './t1.ttf'; $black = imagecolorallocate($dst, 0, 0, 0); imagefttext($dst, 20, 0, 10, 30, $black, $font, 'Hello world!'); /*imagefttext($img,$size,$angle,$x,$y,$color,$fontfile,$text) $img由图像创建函数返回的图像资源 size要使用的水印的字体大小 angle(角度)文字的倾斜角度,如果是0度代表文字从左往右,如果是90度代表从上往下 x,y水印文字的第一个文字的起始位置 color是水印文字的颜色 fontfile,你希望使用truetype字体的路径*/ list($dst_w,$dst_h,$dst_type) = getimagesize($dst_path); /*list(mixed $varname[,mixed $......])--把数组中的值赋给一些变量 像array()一样,这不是真正的函数,而是语言结构,List()用一步操作给一组变量进行赋值*/ /*getimagesize()能获取到什么信息? getimagesize函数会返回图像的所有信息,包括大小,类型等等*/ switch($dst_type){ case 1://GIF header("content-type:image/gif"); imagegif($dst); break; case 2://JPG header("content-type:image/jpeg"); imagejpeg($dst); break; case 3://PNG header("content-type:image/png"); imagepng($dst); break; default: break; /*imagepng--以PNG格式将图像输出到浏览器或文件 imagepng()将GD图像流(image)以png格式输出到标注输出(通常为浏览器),或者如果用filename给出了文件名则将其输出到文件*/ } imagedestroy($dst); ?>
PHP删除n天以前的文件,删除指定目录下指定类型(扩展名)的文件,包括子目录子和目录下的文件.
其中$ext数组代表不删除的文件扩展名.
调用函数trash('目录名',时间值);如trash('./files',3600)
参数时间值的单位是秒,如果省略不写,使用trash('./'),将删除当前时间10秒前及更早的文件.
function trash($folder,$time=10){ $ext=array('php','htm','html'); //带有这些扩展名的文件不会被删除. $o=opendir($folder); while($file=readdir($o)){ if($file !='.' && $file !='..' && !in_array(substr($file,strrpos($file,'.')+1),$ext)){ $fullPath=$folder.'/'.$file; if(is_dir($fullPath)){ trash($fullPath); @rmdir($fullPath); } else { if(time()-filemtime($fullPath) > $time){ unlink($fullPath); } } } } closedir($o); } trash('./');//调用自定义函数