亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

PHP CURL如何處理上傳內(nèi)存中文件,避免磁盤IO開(kāi)銷

jackwang / 875人閱讀

摘要:當(dāng)然該參數(shù)可以通過(guò)修改自己構(gòu)造請(qǐng)求的主體實(shí)現(xiàn)任意大小文件的直接內(nèi)存上傳通過(guò)上傳文件,不管是磁盤文件還是內(nèi)存中的字符串也好,其實(shí)都是基于協(xié)議的請(qǐng)求。

普通的CURL上傳磁盤文件的方式

發(fā)送方 send.php的代碼如下:

 "123456",
    "file_contents" => "@$filename;filename=test.txt;type=text/plain",
);
*/
/*
 * 第二種寫(xiě)法,推薦新版本php中使用
 * CURLFile參數(shù)解釋
 * @$filename 需要上傳的文件,建議使用絕對(duì)路徑
 * @$mimetype: 默認(rèn)是 application/octet-stream,此處留空
 * @$postname: 接收方$_FILES數(shù)組中的文件名,此處為 test.txt
 */
$file = new CURLFile($filename, "", "test.txt");
$post_data = array(
    "extra_info" => "123456",
    "file_contents" => $file,
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);
curl_close($ch);
echo $result;

處理上傳文件的代碼upload.php示例:

";
if(move_uploaded_file($_FILES["file_contents"]["tmp_name"], $uploadfile)) {
    echo "ok!";
} else {
    echo "failed!";
}
//調(diào)試信息
var_dump($_FILES);
var_dump($_POST);
利用 PUT 方法上傳內(nèi)存中的文件

有些時(shí)候腳本產(chǎn)生的臨時(shí)小文件,利用普通的上傳方式,則需要先把文件寫(xiě)入磁盤,再作為文件上傳。產(chǎn)生了額外的開(kāi)銷。最好的辦法是直接上傳。
重新實(shí)現(xiàn)send.php 代碼如下:



沒(méi)有用 php://memory,會(huì)報(bào)錯(cuò) Warning: curl_setopt(): cannot represent a stream of type MEMORY as a STDIO FILE* 暫無(wú)好的解決方案
處理上傳的文件的腳本也需要修改下:



這個(gè)方法,適合上傳小于2MB的文件,否則還是會(huì)生成臨時(shí)文件。當(dāng)然該參數(shù)可以通過(guò)php.ini修改

自己構(gòu)造請(qǐng)求的主體 實(shí)現(xiàn)任意大小文件的直接內(nèi)存上傳

通過(guò)CURL 上傳文件,不管是磁盤文件還是內(nèi)存中的字符串也好,其實(shí)都是基于HTTP協(xié)議的請(qǐng)求。
如果自己構(gòu)造這段請(qǐng)求,便不再局限于文件的形式了。

 array(
        "name" => "test1.txt",
        "type" => "text/plain",
        "content" => "...this is my file content..."
    ),
    "file2" => array(
        "name" => "test.txt",
        "type" => "text/plain",
        "content" => "... this is my two file"
    ),
);
//后端接受的$_POST的數(shù)組值
$postFields = array(
    "myname" => "joe",
);
//@var $data 保存主體的字符串
$data = "";

//先將post的普通數(shù)據(jù)生成主體字符串
foreach ($postFields as $name => $content) {
    $data .= "--" . $delimiter . "
";
    $data .= "Content-Disposition: form-data; name="" . $name . """;
    //multipart/form-data 不需要urlencode,參見(jiàn) http:stackoverflow.com/questions/6603928/should-i-url-encode-post-data
    $data .= "

" . $content . "
";
}
//將上傳的文件生成主體字符串
foreach ($fileFields as $name => $file) {
    $data .= "--" . $delimiter . "
";
    $data .= "Content-Disposition: form-data; name="" . $name . ""; filename="" . $file["name"] . "" 
";
    $data .= "Content-Type: " . $file["type"] . "

";//多了個(gè)文檔類型

    $data .= $file["content"] . "
";
}
//主體結(jié)束的分隔符
$data .= "--" . $delimiter . "--";

$target_url = "http://localhost/upload.php";
$handle = curl_init($target_url);
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_HTTPHEADER , array(
    "Content-Type: multipart/form-data; boundary=" . $delimiter,
    "Content-Length: " . strlen($data))
); 
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($handle);
curl_close($handle);
//echo $result;

這種方式實(shí)現(xiàn)稍顯復(fù)雜,但不需要更改處理上傳的代碼,跟第一種磁盤文件的方法一樣。
其他參考

深入淺出php下的文件上傳 提到了一些安全處理的技巧
簡(jiǎn)述php中curl的使用

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/31867.html

相關(guān)文章

  • 阿里云服務(wù)器 何處網(wǎng)站高并發(fā)流量問(wèn)題?(含教程)

    摘要:阿里云哪個(gè)節(jié)點(diǎn)服務(wù)器好一下看看負(fù)載均衡它是對(duì)多臺(tái)云服務(wù)器進(jìn)行流量分發(fā)的負(fù)載均衡服務(wù),讓整個(gè)服務(wù)器群來(lái)處理網(wǎng)站的請(qǐng)求。負(fù)載均衡支持億級(jí)連接和千萬(wàn)級(jí)并發(fā),可輕松應(yīng)對(duì)大流量訪問(wèn),滿足業(yè)務(wù)需求。原文流量大的網(wǎng)站如何處理高并發(fā)流量問(wèn)題很多平臺(tái)一旦做大了,平臺(tái)的流量就會(huì)陡增,同時(shí)并發(fā)訪問(wèn)的流量也會(huì)暴增,原本規(guī)劃的硬件配置就無(wú)法滿足當(dāng)下的流量問(wèn)題。 那么如何處理好高并發(fā)的流量問(wèn)題呢? 小編將這些分為2個(gè)方...

    waterc 評(píng)論0 收藏0
  • 入門架構(gòu)——單機(jī)高性能

    摘要:協(xié)作方式在高并發(fā)場(chǎng)景中,必須要讓服務(wù)器同時(shí)維護(hù)大量請(qǐng)求連接,可能是一個(gè)服務(wù)進(jìn)程創(chuàng)建另一個(gè)進(jìn)程,也可能是一個(gè)服務(wù)線程去創(chuàng)建另一個(gè)線程,但連接結(jié)束后進(jìn)程或線程就銷毀了,這是一個(gè)巨大的浪費(fèi)一個(gè)自然的想法就是通過(guò)創(chuàng)建一個(gè)進(jìn)程線程池從而達(dá)到資源復(fù)用, showImg(https://segmentfault.com/img/bVbtgn1?w=313&h=208); 協(xié)作方式 在高并發(fā)場(chǎng)景中,必...

    UCloud 評(píng)論0 收藏0
  • 追尋終極數(shù)據(jù)庫(kù) - 事務(wù)/分析混合處系統(tǒng)的交付挑戰(zhàn) (4)(完結(jié)篇)

    摘要:評(píng)估選項(xiàng)本報(bào)告涵蓋了為了支持工作負(fù)載涵蓋運(yùn)營(yíng)和分析,查詢引擎面臨的挑戰(zhàn)的細(xì)節(jié),這些細(xì)節(jié)也可以作為訪問(wèn)數(shù)據(jù)庫(kù)引擎查詢引擎和存儲(chǔ)引擎組合以及滿足事務(wù)運(yùn)營(yíng)分析或混合工作負(fù)載需求的指南。 評(píng)估HTAP選項(xiàng) 本報(bào)告涵蓋了為了支持工作負(fù)載(涵蓋OLTP、運(yùn)營(yíng)、BI和分析),查詢引擎面臨的挑戰(zhàn)的細(xì)節(jié),這些細(xì)節(jié)也可以作為訪問(wèn)數(shù)據(jù)庫(kù)引擎、查詢引擎和存儲(chǔ)引擎組合以及滿足事務(wù)、運(yùn)營(yíng)、分析或混合工作負(fù)載需求的...

    nanchen2251 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<