php将上传的文件上传到远端服务器

问题场景还原如下:
现有一个上传页面,后端控制器用PHP来处理,但是PHP在得到上传来的文件时,要上传给另一个接口(用golang实现的,记为api2)

api2原本也是处理简单的上传逻辑,但是不知道怎么用php模拟上传文件给api2,
(如果有同学知道,烦请告知,非常感谢)
最终采取了如下办法: php将页面上传的文件(记为file),将file的内容用base64编码,作为一个普通的post请求的一个参数传给api2, api2收到后,base64解码,然后写文件,写的文件就是用户上传的文件)。

代码如下:

<form enctype="multipart/form-data" method='post' action="/">
  <input name="file" type="file" value="choose">
  <input type="submit" value="Upload" name="submit">
</form>

<?php
function post_files($url, $file) {
    $data=array();
    // 将文件内容base64编码当作post请求的一个参数
    $data['file'] = base64_encode(file_get_contents($file));

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_POST, true);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}

if (isset($_POST["submit"])) {
    // Move file to a temp location
    $uploadDir = './upload/';
    $uploadFile = $uploadDir . basename($_FILES['file']['name']);
    if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile)){
        
        // 这个就是api2地址: http://localhost:8080/upload
        $response = post_files('http://localhost:8080/upload', $uploadFile);
        echo $response;
    } else {
        echo "上传失败";
    }
} 
?> 

api2实现如下:

const uploadPath = "E:\\workspace\\go\\src\\gerrylon.top\\learnGo\\fileupload\\upload"

func main() {
	http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
		filecontentStr := r.PostFormValue("file")
		filecontents, _ := base64.StdEncoding.DecodeString(filecontentStr)

		// "test.jpg"请根据需要替换(可能需要再加一个字段,将原始文件名传过来)
		fp, _ := os.OpenFile(filepath.Join(uploadPath, "test.jpg"), os.O_CREATE, 0666)
		defer fp.Close()
		fp.Write(filecontents)
	})

	log.Fatal(http.ListenAndServe(":8080", nil))
}

参考:
https://developerscodes.wordpress.com/2016/06/30/how-to-upload-a-file-to-remote-server-in-php-using-curl/

欢迎补充指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值