【问题标题】:Django endpoint to upload image fails when submitted from browser but not postman从浏览器而不是邮递员提交时,Django 端点上传图像失败
【发布时间】:2017-07-07 17:25:45
【问题描述】:

我正在构建一个解决方案,该解决方案从 Web 浏览器截取屏幕截图并将其发送到 django 端点。当我使用邮递员发送信息时,该解决方案有效。但是,当我使用我的 javascript google chrome 扩展程序时,它会失败。我发送的信息由image(text)和dashboard_type(text)两个字段组成,

views.py

class ScreenShotUpload(APIView):
    def post(self, request, format=None):
        dashboard_type = request.data.get("dashboard_type", None)
        image_str = request.data.get("image", None)
        if dashboard_type is None or image_str is None:
            return Response({"Error": "invalid entry"}, status.HTTP_400_BAD_REQUEST)
        if dashboard_type not in [ScreenShot.SH, ScreenShot.WE, ScreenShot.PA, ScreenShot.PR]:
            return Response(
                {"Error": "invalid dashboard_type, must be either PA, PR, SH or WE"}, status.HTTP_400_BAD_REQUEST)
        ScreenShot.objects.filter(is_latest=True).update(is_latest=False)
        new_screenshot = ScreenShot(dashboard_type=dashboard_type, is_latest=True)
        new_screenshot.set_image_path()
        new_screenshot.save_image_str(image_str)
        new_screenshot.save()
        return Response({"status": "200"}, status.HTTP_200_OK)

chrome-extension.js

var id = 100;

chrome.browserAction.onClicked.addListener(function() {

  chrome.tabs.captureVisibleTab(null, {format: "jpeg", quality: 100}, function(screenshotUrl) {
    var xhr = new XMLHttpRequest() , formData = new FormData();
    formData.append("image", screenshotUrl);
    formData.append("dashboard_type", "SH");
    xhr.open("POST", "http://intranet/api/powerbi/screenshots_upload/");
    xhr.send(formData);
    var viewTabUrl = chrome.extension.getURL('screenshot.html?id=' + id++)
    var targetId = null;


  });
});

正如我上面写的,当我使用邮递员将图像作为代表图像的 base64 字符串发送时,它可以工作,但是当我使用此脚本时,它失败(图像损坏),当我发送它时,图像的大小更小脚本比邮递员。我缩小到两种可能性,要么 xhr 请求不发送完整图像,要么我需要以不同的方式解析 request.data。有人可以解释发生了什么吗?谢谢。

【问题讨论】:

    标签: javascript django python-3.x google-chrome-extension


    【解决方案1】:

    我必须删除 data:image/jpeg;base64,我之前在字符串上尝试过 replace("data:image/jpeg;base64,", ""),但我没有工作,但是使用索引可以工作,比如这样 image_str = image_str[23:]

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 2021-10-21
      相关资源
      最近更新 更多