使用django HttpResponse返回二进制数据

d7v8vwbk  于 2023-06-25  发布在  Go
关注(0)|答案(3)|浏览(265)

我试图让Django的HttpResponse返回二进制数据,但没有成功。我一直在尝试不同的方法,但没有成功。
只要二进制数据值不在ASCII字符范围(小于0-255)之外,就可以将字符串编码为ASCII。当使用latin-1编码时也会发生同样的情况。
创建字节字符串工作得很好,但如果包含某些值,例如,如果我在数据中包含以下字节,则似乎失败:“\xf6\x52”,我将得到不同的字节作为结果。由于某种原因,当我试图查看结果响应时,第一个字节\xf6被转换为0xfffd。
我很想得到一些反馈和帮助。
非常感谢!
-A-

e3bfsja2

e3bfsja21#

return HttpResponse(data, content_type='application/octet-stream')

对我很有效

nwlls2ji

nwlls2ji2#

从Django返回二进制数据的灵活方法是首先使用Base64编码数据。
Base64是一组类似的binary-to-text encoding方案,通过将其转换为基数64表示来表示ASCII字符串格式的二进制数据。
由于Base64编码的数据是ASCII,因此默认的HTTP响应内容类型text/html; charset=utf-8可以正常工作。

图片示例

Django

import base64
from io import BytesIO

from django.http import HttpRequest, HttpResponse
import PIL.Image

def image_test(request: HttpRequest) -> HttpResponse:
    file_stream = BytesIO()
    image_data = PIL.Image.open('/path/to/image.png')
    image_data.save(file_stream)
    file_stream.seek(0)
    base64_data = base64.b64encode(file_stream.getvalue()).decode('utf-8')
    return HttpResponse(base64_data)

Web浏览器

从Django获取data后,可以使用base64数据创建data URL

// `data` fetched from Django as Base64 string
const dataURL = `data:image/png;base64,${data}`;
const newImage = new Image();
newImage.src = dataURL;
$('#ImageContainer').html(newImage);

JSON响应

Base64数据也可以作为JSON响应的一部分返回:

import base64
from io import BytesIO

from django.http import HttpRequest, JsonResponse
import PIL.Image

def image_test(request: HttpRequest) -> JsonResponse:
    file_stream = BytesIO()
    image_data = PIL.Image.open('/path/to/image.png')
    image_data.save(file_stream)
    file_stream.seek(0)
    base64_data = base64.b64encode(file_stream.getvalue()).decode('utf-8')
    json_data = dict()
    json_data['base64Data'] = base64_data
    return JsonResponse(json_data)
mqxuamgl

mqxuamgl3#

下面是一个如何使用Django响应二进制数据(在我的例子中是Excel文件)的示例代码:

def download_view(request):
    # If you want to respond local file 
    with open('path/to/file.xlsx', 'rb') as xl:
        binary_data = xl.read()

    # Or if you want to generate file inside program (let's, say it will be openpyxl library)
    wb = openpyxl.load_workbook('some_file.xlsx')
    binary_object = io.BytesIO()
    wb.save(binary_object)
    binary_object.seek(0)
    binary_data = binary_object.read()

    file_name = f'FILENAME_{datetime.datetime.now().strftime("%Y%m%d")}.xlsx'

    response = HttpResponse(
        # full list of content_types can be found here
        # https://stackoverflow.com/a/50860387/13946204
        content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        headers={'Content-Disposition': f'attachment; filename="{file_name}"'},
    )
    response.write(binary_data)
    return response

相关问题