我正在尝试将通过 ajax 发送的 blob 保存为 python 中的文件。在Python之前已经经历过这个:How do I conversion from binary to base 64 and back?
class SaveBlob(APIView):
def post(self, request):
vid = open("file.webm", "wb")
video_stream = request.FILES['blob'].read()
video_stream = struct.pack(video_stream).encode('base64')
# vid.write(video_stream.decode('base64'))
vid.write(video_stream)
vid.close()
return Response()
Run Code Online (Sandbox Code Playgroud)
结果是error: bad char in struct format
简单地使用它vid.write(video_stream.decode('base64'))
而不使用struct.pack保存文件,但是当我打开视频时,它会导致无法确定流的类型。
ajax 调用是这样的,但我想它看起来不错。
function call_ajax(request_type,request_url,request_data) {
var data_vid = new FormData();
console.log(request_url);
data_vid.append('blob', request_data);
console.log(request_data);
var data= [];
try{
$.ajax({
type: request_type,
url: request_url,
data:data_vid,
cors:true,
processData: false,
contentType: false,
async:false,
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRFToken',Cookies.get('csrftoken'))
},
success: function(response){
data =response;
}
});
}catch(error){
console.log(error);
}
return data;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。欢迎对任何缺陷或可能的原因提出任何建议。
您可以尝试使用 Python 的base64库对类中的数据进行编码和解码SaveBlob:
import base64
video_stream = b"hello"
# Save the binary blob as base64
with open('file.webm', 'wb') as f_vid:
f_vid.write(base64.b64encode(video_stream))
# Read back the binary blob from base64
with open('file.webm', 'rb') as f_vid:
video_stream = base64.b64decode(f_vid.read())
print(video_stream)
Run Code Online (Sandbox Code Playgroud)
还给你原来的video_stream:
hello
Run Code Online (Sandbox Code Playgroud)
对于这个简单的示例,保存的文件将显示为:
aGVsbG8=
Run Code Online (Sandbox Code Playgroud)
其他解决方案很有帮助,它将文件写入磁盘,但仍然会显示文件格式不正确或由于缺少插件而无法播放文件。
我想这与 JavaScript 有关(我对此不太熟悉),我必须将所有元数据都保存在 FormData 中。我不知道为什么这有效。在某个地方搜索过并发现这个有效。
很高兴知道上面出了什么问题。会接受解释这一点的任何其他答案。
class SaveVideo(APIView):
def post(self, request):
filename = 'demo.mp4'
with open(filename, 'wb+') as destination:
for chunk in request.FILES['video-blob'].chunks():
destination.write(chunk)
return Response({"status":"ok"})
Run Code Online (Sandbox Code Playgroud)
JavaScript
function xhr(url, data, callback) {
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState == 4 && request.status == 200) {
callback(request.responseText);
}
};
request.open('POST', url);
request.setRequestHeader('X-CSRFToken',Cookies.get('csrftoken'))
request.send(data);
}
var fileType = 'video';
var fileName = 'ABCDEF.webm';
var formData = new FormData();
formData.append(fileType , fileName);
formData.append(fileType + '-blob', blob);
xhr(url,formData,callback_function);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28525 次 |
| 最近记录: |