У меня возникла проблема, когда у меня возникли некоторые проблемы с отправкой изображения imageData canvas на мой сервер для его обработки.
Вот мое действие реагирования / сокращения для отправки данных:
export const edit = (e) => dispatch => {
let payload = store.getState().image.imageData
payload = payload[payload.length-1]
console.log(payload)
const id = e.target.id ? e.target.id : e.target.parentElement.id
fetch(`/api/editing/${id}`, {
method: 'POST',
// headers: {
// "Content-Type": "application/json"
// },
body: JSON.stringify({ imgData: payload })
})
.then(res => res.json())
.then(json => {
dispatch({ type: UPDATE_IMAGE, payload: json.imgData })
// handle response display
})
}
Вот моекак я обрабатываю запрос:
const traitement = require('../../processing/traitement')
router.post('/:type', (req, res) => {
const { imgData } = req.body
const method = req.params.type
const imgDataProcessed = traitement[method](imgData)
return res.status(200).json({ imgData: imgDataProcessed })
})
Вот пример того, как выглядит метод traitement:
negatif: function(imgData) {
console.log(imgData)
var n = imgData.data.length;
for(i=0; i<n; i+=4){
imgData.data[i] = 255 - imgData.data[i];
imgData.data[i+1] = 255 - imgData.data[i+1];
imgData.data[i+2] = 255 - imgData.data[i+2];
imgData.data[i+3] = 255;
}
return imgData;
},
console.log () непосредственно перед отправкой (что я ожидаю отправить)):
ImageData {data: Uint8ClampedArray(180000), width: 300, height: 150}
data: Uint8ClampedArray(180000) [0, 0, 255, 255, 0, 0, 255, 255, 0, 0,
255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255,
255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0,
0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255,
255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0,
0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255,
255, …]
height: 150
width: 300
__proto__: ImageData
Я не могу вставить то, что получаю с сервера, но теряю ключи ширины, высоты, typeof - это Object вместо ImageData, а ключ данных - это typeof Object вместо Uint8ClampedArray.
Итак, мой вопрос: как я могу сделать так, чтобы мой маршрут получил доступ к тем же данным, которые я отправляю, чтобы я мог их обработать?
Как вы можете видеть, я отправляю их в виде строк json иУ меня на сервере есть промежуточное программное обеспечение json bodyparser, может, оно оттуда.Я также думаю о заголовке типа содержимого
РЕДАКТИРОВАТЬ: Благодаря Kaiido я изменил свой код таким образом, который, кажется, работает на 1 исключение
Как я изменил свой код, перед:
let payload = store.getState().image.imageData
payload = payload[payload.length-1]
const id = e.target.id ? e.target.id : e.target.parentElement.id;
console.log(payload)
const meta = {
width: payload.width,
height: payload.height
}
const formData = new FormData();
formData.append("meta", JSON.stringify(meta));
formData.append("data", new Blob([payload.data.buffer]))
fetch(`/api/editing/${id}`, {
method: "POST",
body: formData
})
.then(res => res.arrayBuffer())
.then(buffer => {
console.log(buffer)
const data = new Uint8ClampedArray(buffer)
console.log(data.length)
const newImg = new ImageData(data, payload.width, payload.height)
return newImg
})
назад:
router.post('/:type', (req, res) => {
let form = new formidable.IncomingForm()
form.parse(req, (err, fields, files) => {
fs.readFile(files.data.path, (err, data) => {
const imgProcessed = traitement[req.params.type](data)
console.log(imgProcessed.length)
return res.status(200).json([imgProcessed])
})
})
})
Осталось 1 проблема: при условии, что для тестирования я использую изображение размером 150 * 300 пикселей, мой массив данных должен иметь длину 180000 (300 * 150 * 4)который, пока я не отправлю ответ сервера.Когда фронт получает ответ, он вызывает res.arrayBuffer()
, затем он создает новый Uint8ClampedArray, но тогда моя длина не больше 180000, но в этом случае 543810.Как сказал Кайидо, я мог бы захотеть нарезать этот массив, который я пробовал, но не работает.
Как мне его нарезать?180000 первых?180000 длится один?как-нибудь иначе?