[PHP] CURL文件上传
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">一、说明</span></p><p><span style="font-family: "Microsoft YaHei"; font-size: 18px"> 本文主要简述CURL进行文件上传的一般操作,基于TP5框架;</span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px"> </span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">二、前端</span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px"> 代码如下,需要填入对应的上传地址还有修改接收的参数名字(这里是 <span style="color: rgba(255, 153, 0, 1)">file</span>):</span></p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">form</span><span style="color: rgba(255, 0, 0, 1)">action</span><span style="color: rgba(0, 0, 255, 1)">="上传地址"</span><span style="color: rgba(255, 0, 0, 1)">method</span><span style="color: rgba(0, 0, 255, 1)">="post"</span><span style="color: rgba(255, 0, 0, 1)"> enctype</span><span style="color: rgba(0, 0, 255, 1)">="multipart/form-data"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="file"</span><span style="color: rgba(255, 0, 0, 1)"> name</span><span style="color: rgba(0, 0, 255, 1)">="file"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="submit"</span><span style="color: rgba(0, 0, 255, 1)">></span>上传<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">form</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </p>
<p> </p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">三、后端</span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px"> 下面是基于TP5的上传处理,通过CURL上传到另外一台服务器上。</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">namespace app\controller;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> think\Controller;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">文件上传类</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 255, 1)">class</span> Upload <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Controller
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$file_size</span> = 20971520;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">20M</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$file_type</span> = ["png", "jpg", "jpeg", "gif"<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$ret</span> = ['code'=>0, 'msg'=>'', 'data'=><span style="color: rgba(0, 0, 0, 1)">[]];
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$uploadUrl</span> = "http://xxx.com";<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">上传地址</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> doit()
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(128, 0, 128, 1)">$verify</span> = <span style="color: rgba(128, 0, 128, 1)">$file</span>->validate(['size'=><span style="color: rgba(128, 0, 128, 1)">$this</span>->file_size,'ext'=><span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 0, 1)">file_type]);
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$verify</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> \<span style="color: rgba(0, 0, 255, 1)">Exception</span>('上传的文件大小超过20M, 或文件类型不正确'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(128, 0, 128, 1)">$ext</span> = <span style="color: rgba(0, 128, 128, 1)">pathinfo</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span>->getInfo('name'))['extension'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(128, 0, 128, 1)">$tm</span> = <span style="color: rgba(0, 128, 128, 1)">time</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(128, 0, 128, 1)">$mime</span> = <span style="color: rgba(128, 0, 128, 1)">$file</span>->getInfo('type'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">25</span>
<span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">表单请求参数</span>
<span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(128, 0, 128, 1)">$postData</span> =<span style="color: rgba(0, 0, 0, 1)"> [
</span><span style="color: rgba(0, 128, 128, 1)">28</span> 'file' => <span style="color: rgba(0, 0, 255, 1)">new</span> \CURLFile(<span style="color: rgba(0, 128, 128, 1)">realpath</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span>->getPathname()), <span style="color: rgba(128, 0, 128, 1)">$mime</span>, <span style="color: rgba(128, 0, 128, 1)">$fileName</span>.".{<span style="color: rgba(128, 0, 128, 1)">$ext</span>}"),
<span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 0, 1)"> ];
</span><span style="color: rgba(0, 128, 128, 1)">30</span>
<span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(128, 0, 128, 1)">$curlRes</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>->curlUploadFile(<span style="color: rgba(128, 0, 128, 1)">$this</span>->uploadUrl, <span style="color: rgba(128, 0, 128, 1)">$postData</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(128, 0, 128, 1)">$res</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$curlRes</span>, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">33</span>
<span style="color: rgba(0, 128, 128, 1)">34</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$res</span>['code'] == 200 && <span style="color: rgba(128, 0, 128, 1)">$res</span>['data']['filePath'] != ""<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)">35</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>->ret['code'] = 200<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">36</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>->ret['msg'] = '文件上传成功'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>->ret['data'] = ['filePath' => <span style="color: rgba(128, 0, 128, 1)">$res</span>['data']['filePath'<span style="color: rgba(0, 0, 0, 1)">]];
</span><span style="color: rgba(0, 128, 128, 1)">38</span> }<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">39</span> <span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> \<span style="color: rgba(0, 0, 255, 1)">Exception</span>('上传文件失败: '.<span style="color: rgba(128, 0, 128, 1)">$res</span>['msg'], 500<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">40</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">41</span> }<span style="color: rgba(0, 0, 255, 1)">catch</span>(\<span style="color: rgba(0, 0, 255, 1)">Exception</span> <span style="color: rgba(128, 0, 128, 1)">$ex</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)">42</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">异常处理</span>
<span style="color: rgba(0, 128, 128, 1)">43</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>->ret['code'] = 500<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">44</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>->ret['msg'] = <span style="color: rgba(128, 0, 128, 1)">$ex</span>-><span style="color: rgba(0, 0, 0, 1)">getMessage();
</span><span style="color: rgba(0, 128, 128, 1)">45</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">46</span> <span style="color: rgba(0, 0, 255, 1)">return</span> json(<span style="color: rgba(128, 0, 128, 1)">$this</span>->ret);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回json</span>
<span style="color: rgba(0, 128, 128, 1)">47</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">48</span>
<span style="color: rgba(0, 128, 128, 1)">50</span>
<span style="color: rgba(0, 128, 128, 1)">51</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">CURL文件上传</span>
<span style="color: rgba(0, 128, 128, 1)">52</span> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> curlUploadFile(<span style="color: rgba(128, 0, 128, 1)">$url</span>, <span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">53</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">54</span> <span style="color: rgba(128, 0, 128, 1)">$curl</span> =<span style="color: rgba(0, 0, 0, 1)"> curl_init();
</span><span style="color: rgba(0, 128, 128, 1)">55</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">class_exists</span>('\CURLFile'<span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(0, 128, 128, 1)">56</span> curl_setopt(<span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_SAFE_UPLOAD, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">57</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">$data = array('file' => new \CURLFile(realpath($path)));//>=5.5</span>
<span style="color: rgba(0, 128, 128, 1)">58</span> } <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">59</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">defined</span>('CURLOPT_SAFE_UPLOAD'<span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(0, 128, 128, 1)">60</span> curl_setopt(<span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_SAFE_UPLOAD, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">61</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">62</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">$data = array('file' => '@' . realpath($path));//<=5.5</span>
<span style="color: rgba(0, 128, 128, 1)">63</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">64</span> curl_setopt(<span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_URL, <span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">65</span> curl_setopt(<span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_POST, 1<span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">66</span> curl_setopt(<span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_POSTFIELDS, <span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">67</span> curl_setopt(<span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_RETURNTRANSFER, 1<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">68</span> <span style="color: rgba(128, 0, 128, 1)">$result</span> = curl_exec(<span style="color: rgba(128, 0, 128, 1)">$curl</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">69</span> <span style="color: rgba(128, 0, 128, 1)">$error</span> = curl_error(<span style="color: rgba(128, 0, 128, 1)">$curl</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">70</span>
<span style="color: rgba(0, 128, 128, 1)">71</span> curl_close(<span style="color: rgba(128, 0, 128, 1)">$curl</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">72</span>
<span style="color: rgba(0, 128, 128, 1)">73</span> <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">74</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">75</span> }</pre>
</div>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
生命不息,学习不止<br><br>
来源:https://www.cnblogs.com/reader/p/11444608.html
頁:
[1]