新聞中心
php表單上傳圖片到七牛云存儲并返回地址……求具體流程~有代碼更好
有的,我最近研究了一下,寫了一篇記錄,如下
創(chuàng)新互聯(lián)主打移動網站、成都做網站、網站設計、網站改版、網絡推廣、網站維護、國際域名空間、等互聯(lián)網信息服務,為各行業(yè)提供服務。在技術實力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務,根據(jù)網站的內容與功能再決定采用什么樣的設計。最后,要實現(xiàn)符合網站需求的內容、功能與設計,我們還會規(guī)劃穩(wěn)定安全的技術方案做保障。
原文地址:
網上關于七牛云存儲的教程除了官網上的API文檔,其他的資料太少了。研究了下API之后,現(xiàn)在已經能實現(xiàn)圖片的上傳和下載及上傳之后的重定向。
首先本篇文章實現(xiàn)的功能如下:
1.利用表單上傳功能,用戶可以點擊選擇文件按鈕,選擇本地的一個文件,同時設定上傳的圖片的名稱,點擊上傳按鈕可以上傳并存儲到七牛云存儲。
2.在點擊上傳時會檢測文件的后綴名,限制為jpg和png格式存儲。
3.上傳成功后跳轉到自己設定的一個URL,并傳回文件信息,如文件名。而不是顯示七牛白花花的json顯示頁面。
好啦,那我們開始吧,首先我們要有一個七牛云存儲賬號,如果沒有的就自己去申請吧。
七牛云存儲傳送門:
一.SDK下載
戳這個網址下載一下SDK吧,里面封裝了文件上傳下載等等的方法,我們引入之后可以直接調用。
SDK之中有一個qiniu的文件夾,這是所有的SDK實貨,這個是最重要的。我們首先要把這個文件夾及里面的文件放到項目文件夾中,比如我放到這里。
大家可以看到有一個qiniu文件夾。好啦,資源支持就是這樣。接下來我們要實現(xiàn)代碼咯。
二.文件的上傳。
1.首先把你七牛云存儲的密鑰照出來,點擊賬號設置可以看到有一個AccessKey和SecretKey,留著備用。
2.上傳憑證生成。
在這里我們首先要引入rs.php文件,自己找一對應路徑,代碼如下:
require_once(dirname(__FILE__)."/../../qiniu/rs.php");
dirname()是指的絕對路徑,有時相對路徑會出現(xiàn)問題,建議在前面加上dirname方法獲取絕對路徑。
require_once是引入文件,表示該文件只引入一次。
然后,傳入你的AccessKey和SecretKey
代碼如下:
$accessKey?=?'Imn35KC5pRX7Ov3scxbYkvNk6oIx7zWsBRp16';??//換成你自己的密鑰
$secretKey?=?'s29vc9tlCvs23wRh7QScYTuzCDmEroKj1ddssz';????//換成你自己的密鑰
Qiniu_SetKeys($accessKey, $secretKey);
然后建一個上傳策略對象,將你的bucket?傳入,bucket 就是你的空間名。
$bucket = 'designpartners';
$putPolicy = new Qiniu_RS_PutPolicy($bucket);
然后調用此方法來生成上傳憑證。
$upToken = $putPolicy-Token(null);
接下來就寫一個html表單
form?method="post"?action=""?name?=?"form"?enctype="multipart/form-data"
ul
input?type="hidden"??id="token"?name="token"??value=?php?echo?$upToken?
li
label?for="key"key:/label
input?name="key"?value=""
/li
li
label?for="bucket"照片:/label
input?name="file"??type="file"?/
/li
li
input?type="submit"?value="提交"?
/li
/ul
/form
action?就填寫?up.qiniu.com,表單提供了一個輸入框key,用來輸入你想保存的圖片名稱,上傳到七牛之后就是這個名字。
然后一個文件選擇,一個提交按鈕。運行結果如下:
輸入key值和選擇照片即可實現(xiàn)照片的上傳。哈哈哈有沒有很簡單。
三、文件下載
原理和文件上傳功能相仿。
引入文件
require_once(dirname(__FILE__)."/../../qiniu/rs.php");
聲明你的七牛云存儲域名和兩個密鑰以及向下載的文件名稱
$key?=?'00000';
$domain?=?'designpartners.qiniudn.com';
$accessKey?=?'IOImn35KC5p3scxbYkvNk6oIxB7zWsBRp16';
$secretKey?=?'s29vc9tlCvs23wCDmIbUSi4EroKj1z';
注意:1.key值即為文件名,不要加后綴
2.domain即為bucket加上qiniudn.com,例子中的designpartners就是我在上傳圖片時用的bucket名。
3.accessKey和secretKey換成你自己的,直接用我的不行的..因為我修改了.
Qiniu_SetKeys($accessKey,?$secretKey);??
$baseUrl?=?Qiniu_RS_MakeBaseUrl($domain,?$key);
$getPolicy?=?new?Qiniu_RS_GetPolicy();
$privateUrl?=?$getPolicy-MakeRequest($baseUrl,?null);
echo?$privateUrl?.?"\n";
傳入這四個值即可生成一樣url,直接訪問url即可實現(xiàn)圖片的下載。
在引入圖片時直接
img src = "?php echo $privateUrl; ?"/
即可引入圖片咯,很簡單的吧。
四、303重定向
在上面的方法中,我們上傳圖片成功后跳轉到up.qiniu.com下,會顯示白白的網頁,顯示一個json字符串,但是在實際網站開發(fā)中我們肯定 不能讓用戶看到這種網頁,所以我們用到了303跳轉。SDK中也為我們封裝了這個方法。使用其實非常簡單。在上傳文件的代碼中添加兩行代碼即可
$putPolicy?=?new?Qiniu_RS_PutPolicy($bucket);
$putPolicy-ReturnUrl?=?site_url()."/upload/receiveInfo";
$putPolicy-ReturnBody='{"key":?$(key)}';
注意:1.?ReturnUrl和ReturnBody必須指定,并且首字母要大寫,很多人都小寫開頭,這樣會跳轉不成功。
2.ReturnUrl必須是一個公網可以訪問的網址,在本地測試是不可能通過的。比如你寫成localhost,七牛服務器是定位不到的。
3.這個ReturnUrl的鏈接后會跟著一個?upload_ret=XXX,可以用get方法獲取這個upload_ret。upload_ret的內容是base64安全編碼的json形式的key值。
值的解析:比如我上傳的文件名是555
upload/receiveInfo?upload_ret=eyJrZXkiOiAiNTU1In0=
網址后綴如上所示,把那個upload_ret復制下來,用base64解碼可以出現(xiàn)如下結果:
{"key": "555"}
所以,我們要獲取555這個值的代碼如下,即解析代碼如下:
$upload_ret?=?$_GET['upload_ret'];
$json_ret?=?base64_decode($upload_ret);
$result=json_decode($json_ret);
echo?"key".$result-key;
好啦,獲取到這個key值之后,你可以選擇存到數(shù)據(jù)庫或者進行其他的操作咯。
五、上傳前文件類型的驗證
我們可以用js來驗證文件的后綴名,
在form的屬性里加上
onsubmit="return isValidateFile('file');"
加上一個js方法
script
function?isValidateFile(obj)?{
var?extend?=?document.form.file.value.substring(document.form.file.value.lastIndexOf(".")?+?1);
if?(extend?==?"")?{
alert("請選擇頭像");
return?false;
}
else?{
if?(!(extend?==?"jpg"?||?extend?==?"png"))?{
alert("請上傳后綴名為jpg或png的文件!");
return?false;
}
}
return?true;
}
/script
即可驗證它的類型是否合法。
附:CI代碼實現(xiàn):
獲取Uptoken:
function?getUptoken(){
require_once(dirname(__FILE__)."/../../qiniu/rs.php");
//遠程存儲空間名稱
$bucket?=?'designpartners';
$accessKey?=?'IOImn35KCRX7Ov3scvNk6oIxB7zWsBRp16';
$secretKey?=?'s29vc9tlCvs23wRhTuzCDmIbUSi4EroKj1z';
Qiniu_SetKeys($accessKey,?$secretKey);
$putPolicy?=?new?Qiniu_RS_PutPolicy($bucket);
echo?site_url();
$putPolicy-ReturnUrl?=?site_url()."/upload/receiveInfo";
$putPolicy-ReturnBody='{"key":?$(key)}';
$upToken?=?$putPolicy-Token(null);
return?$upToken;
}
文件上傳:
public?function?uploadPic(){
$upToken?=?$this-getUptoken();
$data['upToken']?=?$upToken;
$this-load-view('upload',$data);
}
303重定向解析:
public?function?receiveInfo(){
$upload_ret?=?$_GET['upload_ret'];
$json_ret?=?base64_decode($upload_ret);
$result=json_decode($json_ret);
echo?"key".$result-key;?
}
文件下載:
public?function?downloadPic(){
require_once(dirname(__FILE__)."/../../qiniu/rs.php");
$key?=?'00000';
$domain?=?'designpartners.qiniudn.com';
$accessKey?=?'IOImn35KC57Ov3scxbYkvNk6oIxB7zWsBRp16';
$secretKey?=?'s29vc9tlCvsh7QScYTuzCDmIbUSi4EroKj1z';
Qiniu_SetKeys($accessKey,?$secretKey);??
$baseUrl?=?Qiniu_RS_MakeBaseUrl($domain,?$key);
$getPolicy?=?new?Qiniu_RS_GetPolicy();
$privateUrl?=?$getPolicy-MakeRequest($baseUrl,?null);
echo?"====?getPolicy?result:?\n";
echo?$privateUrl?.?"\n";
}
表單:
script
function?isValidateFile(obj)?{
var?extend?=?document.form.file.value.substring(document.form.file.value.lastIndexOf(".")?+?1);
if?(extend?==?"")?{
alert("請選擇頭像");
return?false;
}
else?{
if?(!(extend?==?"jpg"?||?extend?==?"png"))?{
alert("請上傳后綴名為jpg或png的文件!");
return?false;
}
}
return?true;
}
/script
form?method="post"?action=""?name?=?"form"?enctype="multipart/form-data"?onsubmit="return?isValidateFile('file');"
ul
input?type="hidden"??id="token"?name="token"??value=?php?echo?$upToken?
li
label?for="key"key:/label
input?name="key"?value=""
/li
li
label?for="bucket"照片:/label
input?name="file"??type="file"?/
/li
li
input?type="submit"?value="提交"?
/li
/ul
/form
ajax上傳“多張圖片“”后PHP返回HTML的的路徑怎樣插入MySQL數(shù)據(jù)庫,單個字段存儲還是多個字段存儲?
多個圖片上傳,可以拆分成單個的上傳,每一個圖片對應一條數(shù)據(jù),然后記錄圖片的信息和存儲路徑等。
然后保存的時候,保存圖片記錄的id就可以,到時候可以根據(jù)id獲取到相關的圖片信息。
如果使用oss等存儲空間,也是他們會每一個圖片返回給你一個圖片路徑,你保存圖片的網絡地址就行,這個時候可以使用一個字段然后通過分隔符,比如‖進行分割,當然,如果圖片數(shù)量是固定的,也可以用多個字段分別存儲路徑。
最后,推薦使用單個字段分隔,因為一般不需要對圖片字段進行檢索,如果需要的話,單個字段查詢后,再封裝接口返回也可以。
php讀取文件夾下面的圖片,返回json數(shù)據(jù)。
?php
$result?=?[];
$folder?=?"images";
$opendir?=?opendir($folder);
while(($image?=?readdir($opendir))?!==?false){
if(
($pos?=?stripos($image,?".jpeg"))?!==?false?or
($pos?=?stripos($image,?".png"))?!==?false?or
($pos?=?stripos($image,?".jpg"))?!==?false
){
$filename?=?substr($image,?0,?$pos);
$result[$filename]?=?''?.?$image;
}
}
$json?=?json_encode($result);
var_dump($json);
?
服務器圖片地址自己更改下 望采納~
標題名稱:php生成圖片后返回數(shù)據(jù) php 生成圖片
標題URL:http://www.dlmjj.cn/article/dojcdsg.html