在 python 中将 blob 保存到文件中

Aks*_*ari 7 javascript python

我正在尝试将通过 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)

任何帮助将不胜感激。欢迎对任何缺陷或可能的原因提出任何建议。

Mar*_*ans 6

您可以尝试使用 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)


Aks*_*ari 0

其他解决方案很有帮助,它将文件写入磁盘,但仍然会显示文件格式不正确或由于缺少插件而无法播放文件。

我想这与 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)