因爲項目中服務器是看成中轉服務器使用,因此須要用到Http請求,項目中採用的是.Net Core框架,http請求使用的是HttpClient 通常前端以表單方式提交數據至服務端時,都須要設置請求頭中Content-Type爲mulipart/form-data,示例代碼以下(vue.js):前端
let content = "hhhh";
let imgs = getFiles(); // getFiles()方法返回一個文件對象數組,可自定義實現,
let formData = new FormData();
formData.append('content', content); // 添加表單參數,可自行添加
for(let i = 0; i < imgs.length; i++) {
formData.append('imgs', imgs[i].file); // 添加文件
}
this.$axios({
url: api.postUrl, // api接口路徑
method: 'post',
data: formData,
// 設置請求頭Content-Type爲multipart/form-data;charset=UTF-8
headers: {
'Content-Type': 'multipart/form-data;charset=UTF-8'
}
}).then(result => {
this.$message({
type: 'success',
message: '成功'
});
})
複製代碼
固然後端也可模擬以上的請求,代碼以下(.Net Core):vue
string url = postUrl;
var content = 'hhhh';
var fileList = getFiles(); // getFiles()方法返回一個文件對象數組
string boundary = DateTime.Now.Ticks.ToString("X");
var formData = new MultipartFormDataContent(boundary);
formData.Add(new StringContent(content), "content");
for(var i=0; i < fileList.Count; i++) {
var file = fileList[i];
byte[] data;
using(var br = new BinaryReader(file.OpenReadStream()))
data = br.ReadBytes((int)file.OpenReadStream().Length);
ByteArrayContent imageContent = new ByteArrayContent(data);
formData.Add(imageContent, 'imgs', file.FileName);
}
HttpClient httpClient = new HttpClient();
httpClient.PostAsync(url, formData).Result;
複製代碼
使用上述代碼轉發到第三方服務器會有問題,會沒法解析表單中的數據。ios
簡要介紹下第三方服務器的狀況: Node.js,框架採用Express, 解析form-data數據的中間件使用的是connect-multiparty,該服務器接收上述請求時,沒法使用 req.body.content 和 req.files 獲取到表單數據和文件,可是當使用中間件multer來解析form-data數據時就能夠,不知道是否是中間件的問題。。axios
要解決上述沒法解析的問題,方法就是添加表單項時,給key加雙引號 "", 即改爲以下:後端
formData.Add(new StringContent(content), "\"content\""); // 使用"\"來轉義, 複製代碼
添加文件表單項時做同上修改,即可以被第三方服務器成功解析到表單數據。api