Linux下,是不是文件夾沒有寫入權限
10年積累的成都網(wǎng)站建設、做網(wǎng)站經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站設計后付款的網(wǎng)站建設流程,更有興寧免費網(wǎng)站建設讓你可以放心的選擇與我們合作。
if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/pjpeg")|| ($_FILES["file"]["type"] == "image/png"))
($_FILES["file"]["size"] 2000000))
{
if ($_FILES["file"]["error"] 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "br /";
}
else
{
$file1=$_FILES["file"]["name"];
$file1=explode('.',$file1);
$file1=time().'.'.$file1[1];
$content = '';
$length = 0;
$fp = fopen($_FILES["file"]["tmp_name"],'r');
if($fp)
{
$f = fstat($fp);
$length = $f['size'];
while(!feof($fp))
{
$content .= fgets($fp,8192);
}
}
$upload_file_options = array('content' = $content, 'length' = $length);
$upload_file_by_content=$oss_sdk_service-upload_file_by_content($bucket, $file1, $upload_file_options);
$data = $this - Admin_model - mGetCorpInfo();
$oldPath = $data['logo_file_path'];
if($oldPath!=''){
$delete_object = $oss_sdk_service-delete_object($bucket,$oldPath);
}
$this - Admin_model - mUpdateCorpPhoto($file1);
//header("Location:".$_SERVER["HTTP_REFERER"]);
echo 'scriptalert("保存成功");/script';
redirect('cSchool','refresh');
}
}
目的
本教程的目錄是通過三個例子介紹如何在Html表單提交直傳OSS第一個例子:講解簽名在客戶端(Javascript)完成,然后直接通過表單上傳到OSS, 注意這個例子有安全風險,推薦使用第二個例子和第三個例子第二個例子:講解簽名在服務端(php)完成,然后直接通過表單上傳到OSS第三個例子:講解簽名在服務端(php)完成, 并且服務端面設置了上傳后回調。然后直接通過表單上傳到OSS,OSS回調完應用服務器再返回給用戶。
背景
每個用OSS的用戶,都會用到上傳。由于是網(wǎng)頁上傳,其中包括一些APP里面的html5頁面,對上傳的需求很強烈,很多人采用的做法是用戶在瀏覽器/APP上傳到應用服務器,然后應用服務器再把文件上傳到OSS。
這種方法有三個缺點,
第一:上傳慢,先上傳到應用服務器,再上傳到OSS,網(wǎng)絡傳送多了一倍,而且OSS是采用BGP帶寬,能保證各地各運營商的速度。
第二:擴展性不好,如果后續(xù)用戶多了,應用服務器會成為瓶頸。
第三:費用高,因為OSS上傳流量是免費的。如果數(shù)據(jù)直傳到OSS,不走應用服務器。那么將能省下幾臺應用服務器。
改進方案1:客戶端用JS直接簽名,然后上傳到OSS示例
下面我將介紹用plupload ,在JS端簽名然后直傳數(shù)據(jù)到OSS的例子用戶電腦瀏覽器測試樣例:用手機測試該上傳是否有效。二維碼:可以用手機(微信,QQ,手機瀏覽器等)掃一掃試試(這個不是廣告,只是上述網(wǎng)址的二維碼。這為了讓大家看一下這個實現(xiàn)能在手機端完美運行。)文件上傳是上傳到一個測試的公共 bucket , 會定時清理,所以不要傳一些敏感及重要數(shù)據(jù)代碼下載
oss-h5-upload-js-direct.tar.gz (381 K) 下載次數(shù):1100原理
本例子的功能
1.采用plupload 直接提高表單數(shù)據(jù)(即PostObject)到OSS2.支持html5,flash,silverlight,html4 等協(xié)議上傳3. 可以運行在PC瀏覽器,手機瀏覽器,微信等4.可以選擇多文件上傳
5.顯示上傳進度條
6.可以控制上傳文件的大小
OSS的PostObject API細節(jié)可以參照(看不懂沒有關系):
;PostObjectplupload
plupload是一款簡單易用且功能強大, 擁有多種上傳方式,(html5, flash, silverlight, html4)等方式,會智能檢測當前環(huán)境選擇最適合的方式,并且會優(yōu)先采用Html5, 所以不用花心思去當前的瀏覽器要用何種方式上傳,plupload會幫您考慮好。
關鍵代碼
因為OSS原生支持POST協(xié)議。所以只要將plupload在發(fā)送POST請求時,帶上OSS簽名即可。
核心代碼如下:
復制代碼
var uploader = new plupload.Uploader({
runtimes : 'html5,flash,silverlight,html4',browse_button : 'selectfiles',
//runtimes : 'flash',
container: document.getElementById('container'),flash_swf_url : 'lib/plupload-2.1.2/js/Moxie.swf',silverlight_xap_url : 'lib/plupload-2.1.2/js/Moxie.xap',url : host,
multipart_params: {
'Filename': '${filename}',
'key' : '${filename}',
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'success_action_status' : '200', //讓服務端返回200,不然,默認會返回204'signature': signature,
},
....
}
簽名signature主要是對policyText進行簽名,最簡單的例子如下:
復制代碼
var policyText = {
"expiration": "2020-01-01T12:00:00.000Z", // 設置該Policy的失效時間,超過這個失效時間之后,就沒有辦法通過這個policy上傳文件了"conditions": [
["content-length-range", 0, 1048576000] // 設置上傳文件的大小限制,如果超過了這個大小,文件上傳到OSS會報錯的]
}
Cors
注意:如果一定要保證bucket屬性Cors設置支持POST方法。因為這個HTML直接上傳到OSS,會產(chǎn)生跨域請求。必須在bucket屬性里面設置允許跨域設置如下圖:
進階篇-應用服務器php返回簽名
背景
上述例子有一個很嚴重的安全隱患。就是OSS AccessId/AccessKey暴露在前端頁面。可以隨意拿到accessid/accesskey. 這是非常不安全的做法將此例子進化,簽名及上傳policy從后端php代碼取。
請求邏輯是:
1.客戶端要上傳圖片時,到應用服務器取上傳的policy及簽名2.客戶端拿到簽名直接上傳到OSS
示例
直接用網(wǎng)頁訪問:用手機測試該上傳是否有效。二維碼:可以用手機(微信,QQ,手機瀏覽器等)掃一掃試試(這個不是廣告,只是上述網(wǎng)址的二維碼。這為了讓大家看一下這個實現(xiàn)能在手機端完美運行。)文件上傳是上傳到一個測試的公共 bucket , 會定時清理,所以不要傳一些敏感及重要數(shù)據(jù)代碼下載
oss-h5-upload-js-php.tar.gz (382 K) 下載次數(shù):600原理
設置plupload 上傳參數(shù)如下:
復制代碼
multipart_params: {
'key' : key + '${filename}' //后面會介紹到,key是應用服務器返回的,指定用戶必須以這個前綴上傳文件。
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'success_action_status' : '200', //讓服務端返回200,不然,默認會返回204'signature': signature,
},
js最主要是從后端取到policyBase64, 及accessid,及signature這三個變量。 往后端取這三個變量核心代碼如下:
復制代碼
phpUrl = './php/get.php'
xmlhttp.open( "GET", phpUrl, false );
xmlhttp.send( null );
var obj = eval ("(" + xmlhttp.responseText+ ")");host = obj['host']
policyBase64 = obj['policy']
accessid = obj['accessid']
signature = obj['signature']
expire = parseInt(obj['expire'])
key = obj['dir']
現(xiàn)在咱們來一起解析一下xmlhttp.responseText(這個是我設計的范圍,并不一定要求是以下的格式,但是必須有signature, accessid, policy這三個值)復制代碼
{"accessid":"6MKOqxGiGU4AUk44",
"host":"","policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19","signature":"I2u57FWjTKqX\/AE6doIdyff151E=","expire":1446726203,"dir":"user-dir/"}
第一個變量accessid: 指的用戶請求的accessid,注意單知道accessid, 對數(shù)據(jù)不會有影響。
第二個變量host: 指的是用戶要往哪個域名發(fā)往上傳請求。
第三個變量policy:指的是用戶表單上傳的策略policy, 是經(jīng)過base64編碼過的字符串第四個變更signature:是對上述第三個變量policy簽名后的字符串第五個變量expire:指的是當前上傳策略失效時間,這個變量,并不是用來發(fā)送到OSS,因為這個已經(jīng)指定在policy里面,這個變量的含義,后面講。
現(xiàn)在咱們分析一下policy的內容,將其解碼后的內容是:
復制代碼
{"expiration":"2015-11-05T20:23:23Z",
"conditions":[["content-length-range",0,1048576000],["starts-with","$key","user-dir\/"]]
這里有一個關鍵的地方,PolicyText指定了該Policy 上傳失效的最終時間。即在這個失效時間之前,都可以利用這個policy上傳文件,所以沒有必要每次上傳,都去后端取簽名。減少后端的壓力。在這里我的設計是:初始化上傳時,每上傳一個文件后,取一次簽名。然后再上傳時,將當前時間跟簽名時間對比,看是簽名時間是否失效了。如果失效了,就重新取一次簽名,如果沒有失效就不取。這里就用到了第五個變量expire核心代碼如下:
復制代碼
now = timestamp = Date.parse(new Date()) / 1000;[color=#000000]//可以判斷當前expire是否超過了當前時間,如果超過了當前時間,就重新取一下.3s 做為緩沖[/color]
if (expire now + 3)
{
.....
phpUrl = './php/get.php'
xmlhttp.open( "GET", phpUrl, false );
xmlhttp.send( null );
......
}
return .
再看一下上面policy 的內容比上面增加了starts-with, 這個指定此次上傳的文件名,必須是user-dir開頭(這個字符串,用戶可以自己指定)為什么要增加這個的含義是:很多場景,一個應用一個bucket,不同用戶的數(shù)據(jù),為了防止數(shù)字覆蓋,每個人上傳到OSS,可以有特定的前綴。那么問題來了,那用戶獲取到這個policy后,是不是在失效期內,都能修改上傳前綴,從而上傳到別人的目錄呢?所以,應用服務器可以在上傳時就指定讓用戶傳文件時,必須是某個前綴。如果用戶拿到了policy他也沒有辦法上傳別人的前綴上。保證了數(shù)據(jù)的安全性。
終級篇--應用服務器php返回簽名及采用上傳回調背景
當采用第二個方案后,問題來了,用戶來了數(shù)據(jù),并且上傳數(shù)據(jù)后,很多場景下,應用服務器都要知道用戶上傳了哪些文件,文件名字,甚至如果是圖片的話,圖片的大小等。為此OSS開發(fā)了上傳回調功能。
千萬注意
上傳回調功能目前只開放了兩個域, 杭州跟北京(即通過oss.aliyuncs.com, oss-cn-hangzhou.aliyuncs.com, oss-cn-beijing.aliyuncs.com 這三個域名能調用上傳回調)。 只有上傳域名是這兩個域,才能調用上傳回調。
增加了請求回調后,用戶的請求邏輯如下:
第一:用戶先向應用服務器取到上傳policy和回調設置第二:應用服務器返回上傳policy和回調
第二:用戶直接向OSS發(fā)送文件上傳請求
第三:等文件數(shù)據(jù)上傳完,OSS給用戶Response前,OSS會根據(jù)用戶的回調設置,請求用戶的服務器。
第四:如果應用服務器返回成功,那么就返回用戶成功,如果應用服務器返回失敗,那么OSS也返回給用戶失敗。這樣確保了用戶上傳成功的照片,應用服務器都已經(jīng)收到通知了。
第五:應用服務器給OSS返回。
第六:OSS將應用服務器返回的內容返回給OSS。
上傳回調功能目前只開放了兩個域, 杭州跟北京(即通過oss.aliyuncs.com, oss-cn-hangzhou.aliyuncs.com, oss-cn-beijing.aliyuncs.com 這三個域名能調用上傳回調)。 只有上傳域名是這兩個域,才能調用上傳回調。
示例
示例:用手機測試該上傳是否有效。二維碼:可以用手機(微信,QQ,手機瀏覽器等)掃一掃試試(這個不是廣告,只是上述網(wǎng)址的二維碼。這為了讓大家看一下這個實現(xiàn)能在手機端完美運行。)文件上傳是上傳到一個測試的公共 bucket , 會定時清理,所以不要傳一些敏感及重要數(shù)據(jù)代碼要添加的東西
復制代碼
new_multipart_params = {
'key' : key + '${filename}',
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'success_action_status' : '200', //讓服務端返回200,不然,默認會返回204'callback': callbackbody,
'signature': signature,
};
上述的callbackbody 是php服務端返回的。在本例中,從后端php取到的內容如下:
復制代碼
{"accessid":"6MKOqxGiGU4AUk44",
"host":"http:\/\/post-test.oss-cn-hangzhou.aliyuncs.com","policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDo1MjoyOVoiLCJjdb25kaXRpb25zIjpbWyJjdb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19","signature":"VsxOcOudxDbtNSvz93CLaXPz+4s=","expire":1446727949,
"callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jdb206MjM0NTAiLCJjYWxsYmFja0hvc3QiOiJvc3MtZGVtby5hbGl5dW5jcy5jdb20iLCJjYWxsYmFja0JvZHkiOiJmaWxlbmFtZT0ke29iamVjdH0mc2l6ZT0ke3NpemV9Jm1pbWVUeXBlPSR7bWltZVR5cGV9JmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9JndpZHRoPSR7aW1hZ2VJdbmZvLndpZHRofSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==","dir":"user-dir\/"}
上面提到callbackbody, 就是上述返回結果里面的callback內容,經(jīng)過base64編碼后的。
解碼后的內容如下:
復制代碼
{"callbackUrl":"","callbackHost":"oss-demo.aliyuncs.com",
"callbackBody":"filename=${object}size=${size}mimeType=${mimeType}height=${imageInfo.height}width=${imageInfo.width}","callbackBodyType":"application/x-www-form-urlencoded"}
內容的解析如下:
CallbackUrl: 指的是oss往這個機器發(fā)送的url請求。
callbackHost:指的的oss發(fā)送這個請求時,請求頭部所帶的Host頭callbackBody: OSS請求時,發(fā)送給應用服務器的內容,可以包括文件的名字,大小,類型,如果是圖片可以是圖片的高度,寬度callbackBodyType: 請求發(fā)送的Content-Type
代碼下載
oss-h5-upload-js-php-callback.tar.gz (412 K) 下載次數(shù):522應用服務器
在上述有一個很重要的地方就是第四步和第五步,OSS與應用服務器交互的時候,問題1:如果我是開發(fā)者,那么我要怎么樣確認請求是從OSS發(fā)送過來的呢?
答案:OSS發(fā)送請求時,會跟應用服務器構造簽名。兩者通過簽名保證。
問題2: 這個簽名是怎么做的?或者有示例代碼嗎?
答案:有的。我上面的例子里面是Callback應用服務器的例子是: (目前只支持linux)上面運行的代碼是:
callback_app_server.py.zip (2 K) 下載次數(shù):365運行方案,在linux下面直接執(zhí)行里面的文件:
python callback_app_server.py
即可,程序自實現(xiàn)了一個簡單的http server.
是不是很簡單!!!!
總結
第一個例子:講解如何在JS直接簽名,直接表單上傳到OSS oss-h5-upload-js-direct.tar.gz (381 K)
第二個例子:講解如何在從后端PHP獲取簽名,然后直接表單上傳到OSS oss-h5-upload-js-php.tar.gz (382 K)
第三個例子:講解如何在從后端PHP獲取簽名及上傳后回調。然后直接表單上傳到OSS,OSS回調完應用服務器再返回給用戶。 oss-h5-upload-js-php-callback.tar.gz (412 K)
他這里有一個上傳示例的
?php?
/**?
*?加載sdk包以及錯誤代碼包?
*/?
require_once?'oss_php_sdk/sdk.class.php';?
$oss_sdk_service?=?new?ALIOSS();?
$bucket?=?'你的bucket名字';?
if?((($_FILES["file"]["type"]?==?"image/gif")?
||?($_FILES["file"]["type"]?==?"image/jpeg")?
||?($_FILES["file"]["type"]?==?"image/pjpeg"))?
($_FILES["file"]["size"]??2000000))?
{?
if?($_FILES["file"]["error"]??0)?
{?
echo?"Return?Code:?"?.?$_FILES["file"]["error"]?.?"br?/";?
}?
else?
{?
echo?"Upload:?"?.?$_FILES["file"]["name"]?.?"br?/";?
echo?"Type:?"?.?$_FILES["file"]["type"]?.?"br?/";?
echo?"Size:?"?.?($_FILES["file"]["size"]?/?1024)?.?"?KBbr?/";?
echo?"Temp?file:?"?.?$_FILES["file"]["tmp_name"]?.?"br?/";?
$content?=?'';?
$length?=?0;?
$fp?=?fopen($_FILES["file"]["tmp_name"],'r');?
if($fp)?
{?
$f?=?fstat($fp);?
$length?=?$f['size'];?
while(!feof($fp))?
{?
$content?.=?fgets($fp,8192);?
}?
}?
$upload_file_options?=?array('content'?=?$content,?'length'?=?$length);?
$upload_file_by_content?=?$oss_sdk_service-upload_file_by_content($bucket,?$_FILES["file"]["name"],?$upload_file_options);?//$_FILES["file"]["name"]這個就是文件名,你可以自己定義的。
$img_url?=?""?.?$bucket?.?"/"?.?$_FILES["file"]["name"];?
echo?"Upload?successfully!?The?OSS?URL?of?this?file:?"?.?$img_url?.?"br?/";?
echo?"If?the?bucket?is?public-read,?the?uploaded?image?can?be?shown?as:"?.?"br?/";?
echo?"img?src=$img_url?/";?
}?
}?
else?
{?
echo?"Invalid?file";?
}
關于文件名我已經(jīng)給你注釋在代碼中了,你試試看
分享名稱:php數(shù)據(jù)上傳到oss php實現(xiàn)數(shù)據(jù)轉發(fā)
文章URL:http://www.chinadenli.net/article32/doogppc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設計、定制開發(fā)、網(wǎng)頁設計公司、動態(tài)網(wǎng)站、網(wǎng)站營銷、網(wǎng)站設計公司
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)