国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

jackwang / 806人閱讀

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

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

發送方 send.php的代碼如下:

 "123456",
    "file_contents" => "@$filename;filename=test.txt;type=text/plain",
);
*/
/*
 * 第二種寫法,推薦新版本php中使用
 * CURLFile參數解釋
 * @$filename 需要上傳的文件,建議使用絕對路徑
 * @$mimetype: 默認是 application/octet-stream,此處留空
 * @$postname: 接收方$_FILES數組中的文件名,此處為 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!";
}
//調試信息
var_dump($_FILES);
var_dump($_POST);
利用 PUT 方法上傳內存中的文件

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



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



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

自己構造請求的主體 實現任意大小文件的直接內存上傳

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

 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的數組值
$postFields = array(
    "myname" => "joe",
);
//@var $data 保存主體的字符串
$data = "";

//先將post的普通數據生成主體字符串
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"] . "
";
}
//主體結束的分隔符
$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;

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31867.html

相關文章

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

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

    waterc 評論0 收藏0
  • 入門架構——單機高性能

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

    UCloud 評論0 收藏0
  • 追尋終極數據庫 - 事務/分析混合處系統的交付挑戰 (4)(完結篇)

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

    nanchen2251 評論0 收藏0

發表評論

0條評論

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