在上一篇文章中,我包裝了fetch方法,使其攜帶cookie。但是之前fetch傳遞的是json數據,現在有了一個上傳文件的需求,因此需要進行修改:
const sendRequest = (url, method, data) => {const csrftoken = Cookies.get('csrftoken')const options = {method: method,headers: {'X-CSRFToken': csrftoken,// 'Content-Type': 'multipart/form-data', //這里可以是application/json,后端需要方式二獲取參數withCredentials: true //跨域時攜帶cookie},credentials: 'include', //要求攜帶cookie,否則無法維持會話}if (method != 'GET' && data && Object.keys(data).length > 0) {if (data instanceof FormData) {options.body = data}else {let formdData = new FormData()for (let key in data) {let value = data[key]if (value instanceof Object&& !(value instanceof File)&& !(value instanceof Blob)) {value = JSON.stringify(value)}formdData.append(key, value)}options.body = formdData}}return fetch(`http://localhost:8000/${url}`, options)
}
這里還是選擇使用formData進行傳遞數據,一是django可以從POST.get(key)直接獲取參數,如果是淺層的就不需要額外json.parse 了,二是json傳輸文件需要base64,可能有性能損失。
注意
這里注意了,不要header中不要設置Content-Type,否則上傳失敗。
這是因為header中包含了一段boundary指明文件的間隔。可以看下成功的請求頭:
在后端就從request.FILES.get(key)獲取文件,從request.POST.get(key)獲取其他參數。
在傳參的時候,還是直接傳遞一個json就可以,然后將其處理為FormData格式。