Я пытаюсь отправить группу файлов .mp4 сначала из клиента веб-браузера, затем в экспресс, а затем в колбу.Этот код может показаться простым, но это заняло буквально несколько дней, потому что никто в Интернете не опубликовал пример того, как сделать это с большими файлами (видеофайлами .mp4), и, честно говоря, есть многонесоответствий в использовании этих библиотек.
Я думаю, что это может быть ошибкой кодирования из экспресс в Flask, однако.Фактические данные, кажется, передаются, но ffmpeg не распознает полученные файлы .mp4 как действительный видеофайл.
От клиента я отправляю запрос XHR следующим образом:
var formData = new FormData();
for(var x=0; x< datas.videoDatas.length; x++){
// data.videoDatas[x] is a blob of a .mp4 file. it can be played
formData.append(x+"_video.mp4",datas.videoDatas[x]);
}
var xhr = new XMLHttpRequest();
xhr.open("POST", 'http://localhost:3000/uploadVid', true);
xhr.onreadystatechange = function() {
if(this.readyState == XMLHttpRequest.DONE && this.status == 200) {
console.log(xhr.response);
}
}
xhr.onload=console.log;
xhr.send(formData);
Экспресс-сервер на порту 3000 получает почтовый запрос, используя библиотеку «multer».Данные хранятся в памяти в виде буфера.
var express = require('express');
var multer=require("multer");
var request=require("request")
var app = express();
var storage = multer.memoryStorage();
const upload = multer({
storage: storage
}).any();
app.post('/uploadVid',function(req,res){
var originalResponse=res;
console.log("begin upload");
upload(req, res, function(err) {
console.log("begin upload to flask server");
var requestStruct={
url: 'http://localhost:3001/receiveUpload2?numFiles='+req.files.length,
method: 'POST',
form: {
}
}
for(var x=0; x < req.files.length; x++){
var testBuffer=req.files[x].buffer; // should be a buffer of the .mp4 file
//testBuffer = new Buffer(10);
//testBuffer=testBuffer.toString();
requestStruct.form[x+'_customBufferFile']= {
value: testBuffer,
options: {
filename: req.files[x].fieldname
}
}
}
request(requestStruct, function(err,res,body){
originalResponse.send(body)
});
});
});
http.createServer(app).listen(3000)
На сервере фляг Python файлы .mp4 принимаются в виде буфера и записываются в файл .mp4.Однако файл .mp4 невозможно воспроизвести с помощью ffmpeg «Неизвестный тип документа EBML (нет)» 0/0 0_video.mp4: конец файла »
from flask import Flask
from flask import request;
app = Flask(__name__);
@app.route('/receiveUpload2', methods=["POST"])
def receiveUpload2():
print("uploaded received....");
numFiles=int(request.args.get("numFiles").encode('ascii', 'ignore'));
print("numFiles",int(numFiles));
for x in range(0,numFiles):
name=request.form.getlist(str(x)+'_customBufferFile[options][filename]');
name=name[0];
print("writing",name);
filebytes=request.form.getlist(str(x)+'_customBufferFile[value]');
filebytes=filebytes[0];
#print(filebytes);
newFileByteArray = bytearray(filebytes,'utf8')
with open("./uploads/"+name,"wb") as output:
output.write(newFileByteArray);
app.run(host="localhost", port=3001);