问题场景还原如下:
现有一个上传页面,后端控制器用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))
}
欢迎补充指正。