Я пытаюсь отправить данные формы с помощью axios, но не могу, в инструментах chrome dev в запросе не отображается контент. Если сделать тот же запрос через почтальона, API ответит нормально.
js
(newData) => {
const data = new FormData();
data.append('name', 'raphael');
data.append('file', {
uri: newData.image.path,
type: 'image/jpeg',
name: 'teste'
});
return axios.post(`${constants.development.URL_API}/file`, data,
headers: {
'Content-Type': 'multipart/form-data',
},
})`
@corujoraphael Из любопытства, этот запрос работал раньше?
@corujoraphael Я не уверен, что ваш код работает как есть. Конфигурация, в которой вы указываете заголовки, должна быть объектом, но в ней отсутствует фигурная скобка:
(newData) => {
const data = new FormData();
data.append('name', 'raphael');
data.append('file', {
uri: newData.image.path,
type: 'image/jpeg',
name: 'teste'
});
return axios.post(
`${constants.development.URL_API}/file`,
data,
{
headers: {
'Content-Type': 'multipart/form-data',
}
},
)
}
Поскольку эта проблема не получила ответа и, судя по имеющейся у нас информации, это не похоже на ошибку Axios, я закрываю эту проблему.
Если вам нужна дополнительная помощь в отладке кода, опубликуйте сообщение на Stack Overflow , Gitter или еще раз прокомментируйте эту проблему.
Спасибо!
@emilyemorehouse , я столкнулся с той же проблемой, используя React Native FormData
let s = JSON.stringify({ uri: localUri, name: filename, type: type });
let formData = new FormData();
formData.append('ph0t0', s);
axios.post("http://10.0.1.2:8888/uploadphoto", {
method: "POST",
headers: {
'Content-Type': 'multipart/form-data; charset=utf-8; boundary="another cool boundary";'
},
body: formData,
}).then((resp) => {
console.log(resp);
}).catch(err => {
console.log(err);
});
Ожидайте, что пары ключ: значение существуют в MultipartForm, Form или PostForm
2018/02/20 18: 25: 31.740 [W] [photo.go: 411] req.MultipartForm: nil
2018/02/20 18: 25: 31.740 [W] [photo.go: 412] req.Form: map []
2018/02/20 18: 25: 31.740 [Вт] [photo.go: 413] треб.
2018/02/20 18: 25: 31.740 [W] [photo.go: 410] req: & {POST / uploadphoto / dialog / 57120e8951c643ab42a8c19f / 000000000000000000000001 HTTP / 1.1 1 1 карта [Content-Type: [application / json; charset = utf-8] User-Agent: [okhttp / 3.6.0] Accept: [application / json, text / plain, / ] Content-Length: [419] Connection: [Keep-Alive] Accept-Encoding: [gzip] Cookie: [lang = zh-TW; PVsessionID = db9a21d63b2d0ea47b68fa8755bd87e2]] 0xc420e3cb80
2018/02/20 18: 25: 31.740 [E] [photo.go: 425] [UploadPhotos] ошибка: запрос Content-Type не является multipart / form-data
Информация о версии
аксиомы: 0,16,2
экспо: 25.0.0
реагировать: 16.2.0
реагировать-родной: 0.52.0
Эта ошибка все еще возникает с последними версиями Axios, почему она была закрыта?
Если кто-то может предоставить воспроизводимый пример, я буду рад открыть эту резервную копию.
@ Ernie6711 похоже, что у вас есть ошибка в вашем коде - я не думаю, что вам следует структурировать данные файла, прежде чем добавлять их в данные формы. Также аргументы для axios.post: axios.post(url[, data[, config]])
Вот пример, основанный на вашем коде:
const file ={ uri: localUri, name: filename, type: type};
const formData = new FormData();
formData.append('file', s);
const config = {
headers: {
'Content-Type': 'multipart/form-data; charset=utf-8; boundary="another cool boundary";'
}
};
axios.post("http://10.0.1.2:8888/uploadphoto", formData, config).then((resp) => {
console.log(resp);
}).catch(err => {
console.log(err);
});
@emilyemorehouse, пожалуйста, проверьте следы
POST /myserver HTTP/1.1
Content-Type: multipart/form-data
_parts=USERX%2Cusername&_parts=FILE1%2C%5Bobject%20Object%5D
У меня есть пример локального клиента и сервера для загрузки файлов, хотя и за пределами среды React Native, который работает и правильно закодирован. Приведенный выше пример на самом деле не воспроизводится, поскольку он основан на переменных и сервере, к которому у меня нет доступа.
Я предполагаю, что если что-то не так с загрузкой, это потому, что данные, добавленные к объекту данных формы, недействительны.
@emilyemorehouse Загрузка файлов отлично работает в среде браузера, они терпят неудачу только при реагировании на native. Как вы сами упомянули - ваши тесты были вне среды react native, я бы начал с нее :)
Попробуйте простую загрузку файла в react native и просто проверьте следы wirehark, вам даже не нужен рабочий сервер ...
У меня то же самое, Axios не реагирует на родной
@duongtranpyco Я удалил аксиомы из своего проекта, вместо этого я написал свой собственный простой класс, наслаждайтесь!
PS Если вы в основном отправляете JSON, измените код. В моем случае сервер обычно ожидает формы.
const request = async ({url, method = 'GET', params, body, responseType = 'json', headers = {}})=>{
const escape = (data, encode = encodeURIComponent)=>Object.keys(data||{}).reduce((pairs, key)=>{
for (let value of [].concat(data[key]))
pairs.push([`${key}`, `${value}`]);
return pairs;
}, []).map(pair=>pair.map(encode).join('=')).join('&');
if (Object.keys(params||{}).length)
url += '?'+escape(params);
if (method=='POST' && typeof body=='object')
{
if (body instanceof FormData)
headers['Content-Type'] = 'multipart/form-data';
else
{
body = escape(body);
headers['Content-Type'] = 'application/x-www-form-urlencoded';
}
}
let {statusCode, request: req} = await new Promise((resolve, reject)=>{
let xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.withCredentials = true;
xhr.responseType = {json: 'text'}[responseType]||responseType;
xhr.onload = ()=>resolve({statusCode: xhr.status, request: xhr});
xhr.onerror = ()=>reject(new TypeError('Network request failed'));
xhr.ontimeout = ()=>reject(new TypeError('Network request timed out'));
for (let key in headers)
xhr.setRequestHeader(key, headers[key]);
xhr.send(body||null);
});
if (statusCode<200 || statusCode>=400)
throw new Error(`network request failed with ${statusCode}: ${url}`);
switch(responseType)
{
case 'json':
return JSON.parse(req.responseText);
case 'text':
return req.responseText;
case 'request':
return req;
}
return req.response;
};
request.get = (url, opt = {})=>request({...opt, url, body: null});
request.post = (url, ...args)=>request({...args[1]||{}, url, method: 'POST', body: args[0]});
Привет, у меня такая же проблема. Кто-нибудь нашел решение?
Второй @giladno. Поскольку я перехожу к другим частям, вместо этого я использую обходной путь: напишите конкретную функцию с помощью fetch () при загрузке изображений.
Пробовал раньше, и ни строковая обработка данных, ни аргументов не влияет на результат. Сервер получил вызов, но данные не отправлены.
@ Ernie6711 очевидно, что заголовки повреждены, и поэтому сервер не может принять данные формы. Я реализовал обходной путь с помощью fetch (), и он работал без проблем.
У меня была проблема с реакцией.
Проблема не в заголовках.
В сети мы можем иметь, например:
let formData = new FormData()
formData.append('key', true // bool value)
но в React Native значение ключа должно быть строкой.
formData.append('key', 'true')
У меня такая же проблема с реагированием на родной язык, когда я отправляю сообщение по URL-адресу, как упоминает @giladno , вы должны протестировать реагировать на родной язык, и вы можете проверить ошибку, о которой люди сообщают @emilyemorehouse. Я сообщаю об ошибке 14 дней назад https://github.com/axios/axios/issues/1618 , но никто не ответил, пожалуйста, опишите в файле readme вашей библиотеки, что у вас нет поддержки axios при реагировании на native, чтобы многие разработчики не теряют времени зря ..!
Да, я ценю направление, но «просто протестируйте загрузку файла в React Native» не так-то просто. Я не часто работаю с React Native, и на запуск проекта с загрузкой файлов для тестирования потребуется приличное количество времени.
У меня есть простой POST с данными формы, который работает в React Native:
const formData = new FormData();
formData.append("data", true);
const config = {
headers: {
"Content-Type": "multipart/form-data; charset=utf-8;"
}
};
axios.post(URL, formData, config).then(
response => {
console.log({ response });
},
error => {
console.log({ error });
}
);
true
получает строку при отправке на сервер, что интересно.
Тем не менее, если кто-нибудь может предоставить пример, который я могу легко развернуть, я буду рад изучить его подробнее.
@corujoraphael, как вы это решили?
Я добавил тип внутри объекта изображения, например "Image.type='image/png"
непосредственно перед добавлением, а также изменил тип содержимого на "Content-Type":"multipart/form-data"
:
image.type='image/png'
formData.append("resource", image);
return axios
.post('yourBAckendUrl', formData, {
headers: {
Authorization: "yourTokenHere",
"Content-Type": "multipart/form-data"
}
})
Надеюсь, это кому-то поможет.
Мне тоже не удалось заставить это работать, я пытаюсь PUT multipart / form-data в S3 (видео). Использование опции типа не помогло. Заголовок multipart / form-data, похоже, отсутствует в запросе PUT:
const data = new FormData();
data.append('video', {
uri: 'file:///<path_to_video_on_iphone.mov',
type: 'video/quicktime',
name: 'video.mov',
});
response = yield call(() => {
return api.put(url, data, {
headers: {
'Content-Type': 'multipart/form-data',
},
transformRequest: [
(data, headers) => {
delete headers.common.Authorization;
return data;
}
]
});
});
В этом случае используйте выборку: D
var data = new FormData();
data.append('my_photo', {
uri: filePath, // your file path string
name: 'my_photo.jpg',
type: 'image/jpg'
}
fetch(path, {
headers: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data'
},
method: 'POST',
body: data
});
в версии axios 0.18.0
имеет ту же проблему.
axios внутренне удаляет заголовок Content-Type
если в post, put
т. д. по какой-то причине нет тела, при создании FormData
тело остается пустым ..
это мой код:
const sendFormData = images => {
// images is an array of base64 images (strings)
const formData = new FormData();
images.forEach((img, i) => {
formData.append('file', img);
formData.append('name', `${type}-${i + 1}`);
});
config.headers = {
.'Content-Type': 'multipart/form-data'
};
return axios.post(`http://someurl.com/api/upload-images`, formData, config)
.then(response => {
// handle success
})
.catch(err => {
// handle err
});
}
React Native версия 0.55.3
этот пример кода не работает. тело запроса пусто, а заголовок Content-Type
удален
У меня такие же проблемы, и мое тело, когда я проверяю отладку, является строкой
и вот мой код
const formData = new FormData();
formData.append('photo', {
uri: response.uri.replace('file://', ''),
mineType: 'image/jpeg',
fileType: 'image/jpg',
type: 'image/jpg',
name: 'test.jpg'
});
console.log('form data', formData);
Axios({
method: 'post',
url: 'https://dev-host.luxstay.net/api/rooms/10740/photos',
data: formData,
headers: {
Authorization: token,
'Content-Type': 'multipart/form-data'
}
});
Обновление: произошла ошибка, потому что приложение находилось в режиме отладки. Когда я выключил режим отладки, он работал
У axios есть код в адаптере xhr
if (utils.isFormData(requestData)) {
delete requestHeaders['Content-Type']; // Let the browser set it
}
Я предполагаю, что в react-native он удаляет заголовок типа содержимого, если вы отправляете данные многостраничной формы, даже если вы устанавливаете его в коде.
Но я не уверен, что комментирование строки решит вашу проблему в react-native.
в версии axios
0.18.0
имеет ту же проблему.
axios внутренне удаляет заголовокContent-Type
если вpost, put
т. д. по какой-то причине нет тела, при созданииFormData
тело остается пустым ..
это мой код:const sendFormData = images => { // images is an array of base64 images (strings) const formData = new FormData(); images.forEach((img, i) => { formData.append('file', img); formData.append('name', `${type}-${i + 1}`); }); config.headers = { .'Content-Type': 'multipart/form-data' }; return axios.post(`http://someurl.com/api/upload-images`, formData, config) .then(response => { // handle success }) .catch(err => { // handle err }); }
React Native версия
0.55.3
этот пример кода не работает. тело запроса пусто, а заголовокContent-Type
удален
Так как же это должно выглядеть? У меня тоже есть объект-объект.
@tkserver выглядит так, когда у вас есть объект, а затем вы его toString ().
const a = {
name: 'dasdasd'
}
console.log(a.toString());
@tkserver выглядит так, когда у вас есть объект, а затем вы его toString ().
const a = { name: 'dasdasd' } console.log(a.toString());
Возможно, я не понял. Должны ли данные запроса отображать [объект объекта] при просмотре заголовков?
@tkserver, если в вашем отладчике включен сетевой осмотр, он переопределит FormData от react-native и приведет к передаче пустого объекта FormData, который будет выглядеть как [Object object] при проверке сети.
Попробуйте сделать запрос с отключением проверки сети, надеюсь, это поможет.
Спасибо Aman725, minhphung210 и всем остальным. Когда я использую код на реальном устройстве, загрузка работает правильно. Казалось бы, это связано с симулятором iOS.
У меня была эта проблема, но теперь она исправлена.
Причина в том, что я отлаживал сетевые запросы. У меня была эта строка кода в точке входа моего приложения:
GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Я прокомментировал это, и теперь он работает.
// IMPORTANT: this will cause FormData requests to fail.
// GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
Я только что нашел это: https://stackoverflow.com/a/47630754/387912 , это помогает?
XMLHttpRequest
Можете ли вы рассказать мне, как вы создали запрос, чтобы он правильно загружался как многосторонний? Я получаю сообщение об ошибке сети:
Error: Network Error
at createError (blob:http://localhost:8081/0754d453-361d-48d1-aaa5-9ff1ad808293:168963:17)
at XMLHttpRequest.handleError (blob:http://localhost:8081/0754d453-361d-48d1-aaa5-9ff1ad808293:168871:16)
at XMLHttpRequest.dispatchEvent (blob:http://localhost:8081/0754d453-361d-48d1-aaa5-9ff1ad808293:28708:27)
at XMLHttpRequest.setReadyState (blob:http://localhost:8081/0754d453-361d-48d1-aaa5-9ff1ad808293:28461:20)
at XMLHttpRequest.__didCompleteResponse (blob:http://localhost:8081/0754d453-361d-48d1-aaa5-9ff1ad808293:28288:16)
at blob:http://localhost:8081/0754d453-361d-48d1-aaa5-9ff1ad808293:28398:47
at RCTDeviceEventEmitter.emit (blob:http://localhost:8081/0754d453-361d-48d1-aaa5-9ff1ad808293:3291:37)
at MessageQueue.__callFunction (blob:http://localhost:8081/0754d453-361d-48d1-aaa5-9ff1ad808293:2588:44)
at blob:http://localhost:8081/0754d453-361d-48d1-aaa5-9ff1ad808293:2345:17
at MessageQueue.__guard (blob:http://localhost:8081/0754d453-361d-48d1-aaa5-9ff1ad808293:2542:13)
ОБНОВЛЕНИЕ: удалось заставить его работать сейчас. В настоящее время используется:
formData.append('picture', {
uri: data.uri,
name: fname,
type: 'image/' + ext
});
Если люди все еще сталкиваются с этой проблемой, а у вас
GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
фрагмент для отладки сетевых запросов, попробуйте добавить
GLOBAL.FormData = GLOBAL.originalFormData || GLOBAL.FormData
у меня это сработало.
Я добавил тип внутри объекта изображения, например
"Image.type='image/png"
непосредственно перед добавлением, а также изменил тип содержимого на"Content-Type":"multipart/form-data"
:image.type='image/png' formData.append("resource", image); return axios .post('yourBAckendUrl', formData, { headers: { Authorization: "yourTokenHere", "Content-Type": "multipart/form-data" } })
Надеюсь, это кому-то поможет.
Спасибо за вашу помощь! Я смог загрузить свою фотографию с помощью iOS Simunator, но не с помощью Android.
После того, как я установил тип изображения на «image / jpeg», у меня прекратилась сетевая ошибка.
const formData = new FormData();
formData.append('file', {
uri: pictureUri,
type: 'image/jpeg',
name: 'profile-picture'
})
Я добавил тип внутри объекта изображения, например
"Image.type='image/png"
непосредственно перед добавлением, а также изменил тип содержимого на"Content-Type":"multipart/form-data"
:image.type='image/png' formData.append("resource", image); return axios .post('yourBAckendUrl', formData, { headers: { Authorization: "yourTokenHere", "Content-Type": "multipart/form-data" } })
Надеюсь, это кому-то поможет.
Спасибо за вашу помощь! Я смог загрузить свою фотографию с помощью iOS Simunator, но не с помощью Android.
После того, как я установил тип изображения на «image / jpeg», у меня прекратилась сетевая ошибка.
const formData = new FormData(); formData.append('file', { uri: pictureUri, type: 'image/jpeg', name: 'profile-picture' })
Для тех, кому это может помочь, если вы не знаете тип содержимого, которое будет отправлено, используйте multipart/form-data
. Сейчас это кажется очевидным, но мне потребовался добрый час, чтобы заставить работать любые средства массовой информации.
data.append("image", {
name: "some_name", // also, won't work without this. A name is required
height: image.height,
width: image.width,
type: "multipart/form-data", // <-- this part here
uri:
Platform.OS === "android" ? image.uri : image.uri.replace("file:/", "")
});
Привет, я пытаюсь загрузить файл Axios в Vue.Js. Может ли кто-нибудь рассмотреть и объяснить проблему?
В HTML
<input type="file" id="file" ref="file" multiple @change="assignFiles"/>
В Js
`assignFiles (e) {
let uploadedFiles = this.$refs.file.files;
for( var i = 0; i < uploadedFiles.length; i++ ) {
this.form.AttachmentDocs.push(uploadedFiles[i]);
}
console.log(this.form.AttachmentDocs);
},`
Итак, при запуске публикации я добавляю данные формы.
`continueSave (e) {
e.preventDefault();
this.$v.$touch();
if(this.$v.$invalid) {
return;
}
this.showLoading(this.loaderId,true);
this.postDatas.append('form',JSON.stringify(this.form));
for( var i = 0; i < this.form.AttachmentDocs.length; i++ ){
let attachment = this.form.AttachmentDocs[i];
this.postDatas.append('files['+i+']',attachment,attachment.name);
}
} `
Итак, в сообщении я проверил заголовок окна консоли, там он показывает
файлы [0]: (двоичный)
файлы [1]: (двоичный)
файлы [2]: (двоичный)
файлы [3]: (двоичный)
На стороне моего сервера я не могу получить файлы.
Может иметь какое-то отношение к
this.postDatas.append('files['+i+']',attachment,attachment.name);
Попробуйте files['+' + i + '+']
У меня такая же проблема с fetch api. req.body был пуст в узле js. Использование слова «экспресс-грозный» решило проблему. https://www.npmjs.com/package/express-formidable
Может иметь какое-то отношение к
this.postDatas.append('files['+i+']',attachment,attachment.name);
Попробуйте
files['+' + i + '+']
Sry + указывает конкатенацию, ват - использование строки '+'. Результатом будут файлы [+0+]
У меня такая же проблема с fetch api. req.body был пуст в узле js. Использование слова «экспресс-грозный» решило проблему. https://www.npmjs.com/package/express-formidable
Вы включили app.use(express.json({ extended: false }));
?
Может иметь какое-то отношение к
this.postDatas.append('files['+i+']',attachment,attachment.name);
Попробуйте
files['+' + i + '+']
Sry + указывает конкатенацию, ват - использование строки '+'. Результатом будут файлы [+0+]
Ваш текущий код всегда будет приводить к files[+i+]
в вашем цикле for. Это никогда не будет files[+0+], files[+1+], files[+2+], etc
.
Кроме того, files[+0+]
никогда не будет существовать. Не уверен, что вы пытаетесь сделать. Вам нужно files[0], files[1], files[2]...
? Если вы пытаетесь построить объект, у вас может быть files['+0+']
, но, опять же, я не уверен, чего вы пытаетесь достичь.
У меня такая же проблема с fetch api. req.body был пуст в узле js. Использование слова «экспресс-грозный» решило проблему. https://www.npmjs.com/package/express-formidable
Вы включили
app.use(express.json({ extended: false }));
?
Нет. Однако в грозном у меня есть одна проблема. Загруженное изображение будет занимать все необходимые поля. В файлах запроса ничего нет. Не уверен, почему это происходит.
@duongtranpyco Я удалил аксиомы из своего проекта, вместо этого я написал свой собственный простой класс, наслаждайтесь!
PS Если вы в основном отправляете JSON, измените код. В моем случае сервер обычно ожидает формы.
const request = async ({url, method = 'GET', params, body, responseType = 'json', headers = {}})=>{ const escape = (data, encode = encodeURIComponent)=>Object.keys(data||{}).reduce((pairs, key)=>{ for (let value of [].concat(data[key])) pairs.push([`${key}`, `${value}`]); return pairs; }, []).map(pair=>pair.map(encode).join('=')).join('&'); if (Object.keys(params||{}).length) url += '?'+escape(params); if (method=='POST' && typeof body=='object') { if (body instanceof FormData) headers['Content-Type'] = 'multipart/form-data'; else { body = escape(body); headers['Content-Type'] = 'application/x-www-form-urlencoded'; } } let {statusCode, request: req} = await new Promise((resolve, reject)=>{ let xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.withCredentials = true; xhr.responseType = {json: 'text'}[responseType]||responseType; xhr.onload = ()=>resolve({statusCode: xhr.status, request: xhr}); xhr.onerror = ()=>reject(new TypeError('Network request failed')); xhr.ontimeout = ()=>reject(new TypeError('Network request timed out')); for (let key in headers) xhr.setRequestHeader(key, headers[key]); xhr.send(body||null); }); if (statusCode<200 || statusCode>=400) throw new Error(`network request failed with ${statusCode}: ${url}`); switch(responseType) { case 'json': return JSON.parse(req.responseText); case 'text': return req.responseText; case 'request': return req; } return req.response; }; request.get = (url, opt = {})=>request({...opt, url, body: null}); request.post = (url, ...args)=>request({...args[1]||{}, url, method: 'POST', body: args[0]});
Я использую этот код в своем проекте. Я пытаюсь понять этот код. Один вопрос, нужна ли эта строка,
for (пусть значение [] .concat (data [key]))? Это можно написать просто,
pair.push ([ ${key}
, ${data[key]}
]);
Если люди все еще сталкиваются с этой проблемой, а у вас
GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;
фрагмент для отладки сетевых запросов, попробуйте добавить
GLOBAL.FormData = GLOBAL.originalFormData || GLOBAL.FormData
у меня это сработало.
Где это?
У меня тоже была проблема. Это вызвано путем к файлу в android.
const путь = utils.isAndroid ()?
И он работает нормально с реализацией следующего
const formData = new FormData();
const path = utils.isAndroid() ? `file://${filePath}` : filePath;
formData.append('Voice', {
uri: path,
name: 'test',
type: 'audio/wav',
});
formData.append('Content-Type', 'audio/wav');
const headers = {
'Content-Type': 'multipart/form-data',
};
return this._sendRequest(url, 'POST', formData, headers);
data.append('file', {
uri: newData.image.path,
type: 'image/jpeg',
name: 'teste'
Используйте имя типа: name:'teste.jpeg'
и оно будет работать. вам нужно указать формат файла, иначе он не будет работать.
Я исправил это, указав имя: 'example.jpeg'
После нескольких дней попыток загрузить видео с помощью Axios я просто сдаюсь. RNFetchBlob - лучший вариант для загрузки файлов, особенно с Android. Этот раздел легко реализовать
Самый полезный комментарий
Эта ошибка все еще возникает с последними версиями Axios, почему она была закрыта?