成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

jackwang / 823人閱讀

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

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

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

 "123456",
    "file_contents" => "@$filename;filename=test.txt;type=text/plain",
);
*/
/*
 * 第二種寫法,推薦新版本php中使用
 * CURLFile參數(shù)解釋
 * @$filename 需要上傳的文件,建議使用絕對路徑
 * @$mimetype: 默認是 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)存中的文件

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



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



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

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

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

 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,參見 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"] . "

";//多了個文檔類型

    $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;

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31867.html

相關(guān)文章

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

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

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

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

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

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

    nanchen2251 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<