php中上传图片到mysql数据库中_php上传图片到数据库源码-程序员宅基地

技术标签: 浏览器  php  服务器  mysql  数据库  internet  

  这次做了一个小小的项目主要是将图片保存在数据库中,以前图片只是在数据库中报存图片在文件夹中的位置在用的时候再调用!!现在却不是太想用这方法。于是想把图片保存在数据库中,经过一段时间的努力终于发现原来mysql中有一种:bolb的类型!保存二进制文件!

MySQL数据库为BLOB做出的定义如下:BLOB数据类型是一种大型的二进制对象,可以保存可变数量的数据。BLOB具有四种类型,分别是TINYBLOB,BLOB, MEDIUMBLOB 和LONGBLOB,区别在于各自所能够保存的最大数据长度不同。

 现将实例展示如下:

建立数据库:

CREATE TABLE ccs_image (
id int(4) unsigned NOT NULL auto_increment,
description varchar(250) default NULL,
bin_data longblob,
filename varchar(50) default NULL,
filesize varchar(50) default NULL,
filetype varchar(50) default NULL,
PRIMARY KEY (id)
)

接着是上传文件的页面,upload.php,code如下:

<HTML>
<HEAD><TITLE>Store binary data into SQL Database</TITLE></HEAD>
<BODY>

<?php
if (isset($_POST['submit'])) {
$form_description = $_POST['form_description'];
$form_data_name = $_FILES['form_data']['name'];
$form_data_size = $_FILES['form_data']['size'];
$form_data_type = $_FILES['form_data']['type'];
$form_data = $_FILES['form_data']['tmp_name'];

$connect = MYSQL_CONNECT( "localhost", "root", "") or die("Unable to connect to MySQL server");
mysql_select_db( "test") or die("Unable to select database");

$data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));

//echo "mysqlPicture=".$data;

$result=MYSQL_QUERY( "INSERT INTO ccs_image (description,bin_data,filename,filesize,filetype) VALUES ('$form_description','$data','$form_data_name','$form_data_size','$form_data_type')");

$id= mysql_insert_id();
print "

This file has the following Database ID: <a href='getdata.php?id=$id'>$id";

MYSQL_CLOSE();

} else {

?>
<center>
<form method="post" action="http://localhost/temp/1018/upload.php" enctype="multipart/form-data">
File Description:
<input type="text" name="form_description" size="40">
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000000"> <br>
File to upload/store in database:
<input type="file" name="form_data" size="40">

<input type="submit" name="submit" value="submit">
</form>
</center>
<?php
}
?>
</BODY>
</HTML>

 

  上文中的$_FILES['form_data']['name']; 等是获取刚上传来的文件的信息,php manual中有提到


注: 要确保文件上传表单的属性是 enctype="multipart/form-data",否则文件上传不了。

全局变量 $_FILES 自 PHP 4.1.0 起存在(在更早的版本中用 $HTTP_POST_FILES 替代)。此数组包含有所有上传的文件信息。

以上范例中 $_FILES 数组的内容如下所示。我们假设文件上传字段的名称如上例所示,为 userfile。名称可随意命名。


$_FILES['userfile']['name']
客户端机器文件的原名称。

$_FILES['userfile']['type']
文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。

$_FILES['userfile']['size']
已上传文件的大小,单位为字节。

$_FILES['userfile']['tmp_name']
文件被上传后在服务端储存的临时文件名。

$_FILES['userfile']['error']
和该文件上传相关的错误代码。此项目是在 PHP 4.2.0 版本中增加的。

$data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));

默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

显示图片,getdata.php,code如下

<?php
if(isset($_GET['id'])) {
$id = $_GET['id'];
$connect = MYSQL_CONNECT( "localhost", "root", "") or die("Unable to connect to MySQL server");
mysql_select_db( "test") or die("Unable to select database");

$query = "select bin_data,filetype from ccs_image where id=$id";
$result = @MYSQL_QUERY($query);

$data = @MYSQL_RESULT($result,0, "bin_data");
$type = @MYSQL_RESULT($result,0, "filetype");

Header( "Content-type: $type");
echo $data;
}
?>
 

这样就算完成了,但这样只是显示单张图片
编写两个文件。其中,第一个文件作为HTML页面的模板,定位图片的显示位置。第二个文件则被用来从数据库中实际输出文件流,作为<IMG>标签的SRC属性。其实第二个文件就是getdata.php。第一个文件的代码如下:
<HTML>
<BODY>
<?php
$connect = MYSQL_CONNECT( "localhost", "root", "") or die("Unable to connect to MySQL server");
mysql_select_db( "test") or die("Unable to select database");
$result=mysql_query("SELECT * FROM ccs_image") or die("Can't Perform Query");
While ($row=mysql_fetch_array($result)){

$id=$row[id];
echo "<img src=/"show.php?id=".$id."/">winson<br>";
}
?>
</BODY>
</HTML>
 

最后提醒一点,header()函数使用前一定不能有任何输出,就算"<?php"前有个空格都不行

 

 

mime类型的意思(百度百科解释如下):

MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
 

 

  MIME的英文全称是"Multipurpose Internet Mail Extensions" 多功能Internet 邮件扩充服务,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
 

 

  MIME能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。这个标准被定义在; RFC 2045,; RFC 2046,; RFC 2047,; RFC 2048,; RFC 2049等RFC中。 由RFC 822转变而来的RFC 2822,规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息都不能在电子邮件中传输。MIME规定了用于表示各种各样的数据类型的符号化方法。
 

 

  浏览器接收到文件后,会进入插件系统进行查找,查找出哪种插件可以识别读取接收到的文件。如果浏览器不清楚调用哪种插件系统,它可能会告诉用户缺少某插件,或者直接选择某现有插件来试图读取接收到的文件,后者可能会导致系统的崩溃。传输的信息中缺少MIME标识可能导致的情况很难估计,因为某些计算机系统可能不会出现什么故障,但某些计算机可能就会因此而崩溃。
 

 

  检查一个服务器是否正确设置了MIME类型的步骤是:
 

 

  1. 在Netscape浏览器中打开服务器网页
 

 

  2. 进入"View"菜单,选择"Page Info"
 

 

  3. 在弹出的窗口中点击上层框架中的"EMBED"
 

 

  4. 在下层框架中查看MIME的类型是否为"application/x-director"或"application/x-shockwave-flash",如果是上述信息的话表明服务器已经正确设置了MIME类型;而如果MIME类型列出的是文本内容、八位一组的数据或是其它形式均表明服务器的MIME类型没有设置正确。
 

 

  如果服务器没有正确标明其发送的数据的类型,服务器管理员应该正确添加相关信息,具体操作方法非常简单快捷。
 

 

  Microsoft公司应用于Windows系统下的浏览器使用ActiveX控件,而不是Netscape插件,这种浏览器不必象其它浏览器那样依靠MIME的编码。"OBJECT"标签的"CLSID"属性准确地标明了应调用哪种程序来读取接收到的文件,因此浏览器不必象"EMBED"标签那样选择一种读取程序。正因为如此,你往往会在使用带插件的浏览器时遇到MIME问题,而使用ActiveX控件的浏览器则很少出现此类麻烦。
 

 

  正由于上述工作方式的差别也解释了一种现象,不知你是否发现在使用Netscape浏览器播放WAV文件时,浏览器会调用LiveConnect插件进行播放,而其它浏览器一般都使用通用的QuickTime的播放插件等来进行播放,这是因为Netscape浏览器接收文件需要读取MIME标识符,以便决定调用哪种程序来读取接收的文件,而服务器设置在Netscape浏览器中播放WAV文件应使用LiveConnect插件,因此Netscape浏览器接收到WAV格式的文件时必然就会调用LiveConnect插件,但由于其它浏览器不使用这种方式,因此它们都使用系统默认的播放WAV格式文件的播放器。当然Flash电影文件并不存在这种问题,因为只有Flash播放器才能够正确读取这种格式的文件。
 

 

  在把输出结果传送到浏览器上的时候,浏览器必须启动适当的应用程序来处理这个输出文档。这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成。在HTTP中,MIME类型被定义在Content-Type header中。
 

 

  例如,假设你要传送一个Microsoft Excel文件到客户端。那么这时的MIME类型就是“application/vnd.ms-excel”。在大多数实际情况中,这个文件然后将传送给Execl来处理(假设我们设定Execl为处理特殊MIME类型的应用程序)。在ASP中,设定MIME类型的方法是通过Response对象的ContentType属性。
 

 

  多媒体文件格式MIME
 

 

  最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leeleo18/article/details/6476100

智能推荐

Unity3D 文字线条效果_unity text自适应横线-程序员宅基地

文章浏览阅读561次。基于Unity实现的文字线条效果,代码添加到Text组件的物体上修改Type属性即可看到效果。using System.Text.RegularExpressions;using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public enum LineType { none, upperline, middleLine, _unity text自适应横线

在php里面找出有用的代码,实用的9个PHP代码片段-程序员宅基地

文章浏览阅读69次。实用的9个PHP代码片段在开发网站、app或博客时,代码片段可以真正地为你节省时间。今天,我们就来分享一下我收集的一些超级有用的PHP代码片段。一起来看一看吧!1.创建数据URI数据URI在嵌入图像到HTML / CSS / JS中以节省HTTP请求时非常有用,并且可以减少网站的加载时间。下面的函数可以创建基于$file的数据URI。function data_uri($file, $mime) ..._php项目怎么快速地找到页面对应的代码片段

checkio (tic-tac-toe)_"a game's result is presented as a list of strings-程序员宅基地

文章浏览阅读1.6k次。Tic-Tac-Toe, sometimes also known as Xs and Os, is a game for two players (X and O) who take turns marking the spaces in a 3×3 grid. The player who succeeds in placing three respective marks in a hori_"a game's result is presented as a list of strings, where \"x\" and \"o\" are pla"

【Python】实现对excel文件数据读取_python table.nrows-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏71次。一创建excel工作表在桌面上仙剑excel表格命名为angle。xlsx保存,在其中创建3张工作表,分别为Sheet1,Sheet2,Sheet3。二、读取导入模块:import xlrd打开excel文件读取数据:data=xlrd.open_workbook(‘C:\Users\ljh30\Desktop\angle.xlsx’)获取一个工作表:①通过索引顺序获取:table=data.sheets()[0]②通过索引顺序获取:table=data.sheet_by_inde_python table.nrows

java list 转 integer_Java中List, Integer[\], int[]的相互转换-程序员宅基地

文章浏览阅读350次。Java中List, Integer[], int[]的相互转换有时候list和数组int[]转换很麻烦。List和String[]也同理。难道每次非得写一个循环遍历吗?其实一步就可以搞定。本文涉及到一些Java8的特性。如果没有接触过就先学会怎么用,然后再细细研究。import java.util.Arrays;import java.util.List;import java.util.str..._list转interger

数学建模——线性规划模型详解Python代码_python线性规划转化标准型-程序员宅基地

文章浏览阅读1.7k次。数学建模——线性规划模型详解Python代码标准形式为:min z=2X1+3X2+xs.tx1+4x2+2x3>=83x1+2x2>=6x1,x2,x3>=0上述线性规划问题Python代码import numpy as npfrom scipy.optimize import linprogc = np.array([2, 3, 1])A_up = np.array([[-1, -4, -2], [-3, -2, 0]])b_up = np.array([-8_python线性规划转化标准型

随便推点

linux安装了samba后怎么用,linux中安装samba的安装和使用详解-程序员宅基地

文章浏览阅读219次。linux中安装samba的安装和使用详解发布时间:2009-08-03 20:35:54来源:红联作者:zwb_nba本人学linux也没有多长时间,为了安装一些东西也费了不少时间,下面我就写下我安装samba的心得,赠给有缘人!1,我所用的环境,在虚拟机中安装的RedHat9.02,安装samba是为了使windows和linux能共享2.1,查看本机的IP地址和网络连接情况ifconfig ..._在linux系统上安装samba软件和相应的依赖库后,根据需求通过编辑smb.conf配置文件,

SpringBoot自定义HTML生成PDF,支持水印文本及图片_springboot html转pdf-程序员宅基地

文章浏览阅读236次。根据HTML实现数据渲染填充PDF动态列表,表格,图片步骤3、自定义HTML模版注:需要前端配合自定义模版计算高度 否则会导致边框 分页失效步骤4、Controller实现步骤5 Yml设置注:注意路径读取,及字体文件Ftl模版高度设置_springboot html转pdf

【高效开发工具系列】typora设置图床_typero图床设置-程序员宅基地

文章浏览阅读318次。安装 picgo 的插件picgo-plugin-sftp-uploader 是 PicGo 的一个插件,它可以将图片上传到 SFTP 服务器。SFTP 是 SSH 文件传输协议的缩写,它是一种安全的文件传输协议,通过使用 SSH 协议的加密和身份验证机制来保护传输的数据。使用 picgo-plugin-sftp-uploader 插件,您可以将图片上传到 SFTP 服务器,从而实现图片的备份、共享和传输。_typero图床设置

传智播客设计学院简介网页代码_传智播客设计学院简介代码-程序员宅基地

文章浏览阅读5.5k次,点赞2次,收藏10次。项目任务项目分析1.该网页分为左右两大板块2.左边为字图结合,可在图片处理工具中将图片设计好,再将该图片设为背景即可3.左图中文字部分可用有序列表制作4.左图制作好后,设置左浮动,在进行右边的文字简介编辑5.右边文字可分为三个段落,分别编辑,并将"传智播客设计学院"字体加粗即可下面我们来看代码HTML 部分代码<!DOCTYPE html PUBLIC "-//W3C/..._传智播客设计学院简介代码

Groovy 闭包_胖子的家_百度空间-程序员宅基地

文章浏览阅读75次。Groovy 闭包_胖子的家_百度空间 Groovy 闭包_胖子的家_百度空间Groovy 闭包2008-03-04 15:28闭包Groovy 中最令人兴奋和最强大的功能是支持闭包。闭包(Closure)类似于 Java 语言中的匿名内部类。闭包和匿名内部类都是可..._jenkinsfile groovy 闭包能隔离参数吗

[webGL学习]基于three.js构建WebGL实例第二讲_webgl+three.js案例-程序员宅基地

文章浏览阅读5.9k次,点赞2次,收藏5次。我们来继续来学习 WebGL 的 three.js 库。 今天做些不一样的东西(如 MeshBasicMaterial,MeshLambertMaterial 和 MeshPhongMaterial),尽量使用各种参数(color,opacity,ambient,emissive,specular),讲解如何制作纹理和凹凸映射的使用。HTML代码<!DOCTYPE html><html la_webgl+three.js案例

推荐文章

热门文章

相关标签