台灣最大程式設計社群網站
線上人數
612
 
會員總數:242468
討論主題:187511
歡迎您免費加入會員
討論區列表 >> PHP >> PHP 以 curl 傳送圖檔給 ASP.NET 的request.File 接收
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
PHP 以 curl 傳送圖檔給 ASP.NET 的request.File 接收
價值 : 450 QP  點閱數:129 回應數:6

樓主

蝶璃
門外漢
0 6
484 11
發送站內信

不好意思,最近遇到了一些問題, 想麻煩前輩們的指教,
最近在實作在php的網站中post的圖片到asp.net的網站中
php的部份使用curl來實作post圖片
下面這段程式碼是處理檔案要加入post的項目


其中 $conetnt["FileContent"] 是這樣取得的



目前可以正常的用 .net 的 request.files 取得 filename 和 content-type
但是存下來的檔案無法正常讀取,查了很久資料還是不太清楚在哪裡>"<

因為實在不確定是.net的語法錯還是php的語法錯>"<
所以先PO在這裡, 如果發錯地方的話, 麻煩和我說一下

搜尋相關Tags的文章: [ php ] , [ curl ] , [ request ] , [ file ] , [ request ] , [ asp.net ] ,
本篇文章發表於2018-05-04 18:04
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

淺水員
檢舉此回應
我剛剛測試這段別人提供的程式碼可以正常上傳檔案
(程式碼:PHP:CUELFile-User Contributed Notes post by CertaiN)

雖然他給的程式碼是給比較早期版本的 PHP
但是 multipart/form-data 格式是共通的
所以現在的版本也可以用(PHP7測試成功)

至於比較新版本的 PHP 好像可以直接用 CURLFile 物件
就不用自己辛苦去生成 multipart/form-data 資料流
不過我還沒測試

回過頭看樓主寫的程式碼
我想有幾點可以檢查看看
1. $eol 是否為 CRLF。
2. 檢查 $delimiter 有沒有出現在要傳送的資料中,如果有的話要更換(可以參考上面程式碼 // generate safe boundary 那邊)。
3. 確認第8行的 $content["FileConent"] 真的跟原檔案一樣,這邊看不出來檔案有沒有正確的讀取到你的關聯陣列中。依照1F程式碼,您的 $files 結構應該是:[檔名=>["FileContent"=>檔案內容],…]
本篇文章回覆於2018-05-04 20:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

淺水員
檢舉此回應
這是用 CURLFile 傳檔案的範例,還滿簡單的

本篇文章回覆於2018-05-04 21:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

Matsuri
檢舉此回應
不好意思, 方便可以再請問一下, 第二點是什麼意思呢?
是指說$delimiter帶了多餘的資料嗎?

我想我應該還是把完整程式PO出來可能會比較好讓大家判斷狀況, 真的很不好意思>"<,
我目前的程式如下
目前這樣子寫的話,$fields 可以正常的傳過去, 接收也沒問題
$files 的filename 和 contenttype 也都有正常的傳送和接收, 但只有圖檔存下來會變成無效的圖像
.net那邊是用request.files[0].saveas 去儲存的




本篇文章回覆於2018-05-05 16:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

淺水員
檢舉此回應
22行:$data .= $content["FileConent"] . $eol; 拼錯
正確應該是 FileContent
本篇文章回覆於2018-05-05 17:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

Matsuri
檢舉此回應
謝謝你!!
後來我找到問題了, 其實PHP這端我沒有寫錯(除了錯字之外(艸))
問題是在因為傳送binary過去, 所以在.net那邊要用 BinaryReader 去讀取 Request.Files.InputStream
這個方法其實測試時之前我也有用過
只是可能因為打錯字, 所以一直沒有資料過去,
總之還是很謝謝你!!
因為你也有給我一些很有用的資訊, 像是curlfile這個
本篇文章回覆於2018-05-05 19:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

淺水員
檢舉此回應
忘記說明第2點的部分
假設你的 $delimiter 是 abcde
那麼接收端會以 --abcde\r\n 作為資料分界符號
萬一我傳送的圖檔的資料中剛好也出現 --abcde\r\n 就會被判斷為分界符號而出錯
因此我在先前給的網址中,他的做法是把每個分段資料準備好之後,才去產生沒有出現在資料中的分界符號

雖然我覺得了解 multipart/form-data 格式是很好的練習
但是如果 PHP 版本有提供 CURLFile 物件
直接使用會比較安全(至少不用擔心上述的問題)

你 3F 的程式用 CURLFile 的話,程式碼其實不多:

本篇文章回覆於2018-05-05 21:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.