You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中通过Ajax上传图片至Cloudinary遇编码错误求助

解决Ajax上传图片到Django+Cloudinary时的ASCII编码错误

看起来你遇到的是Python 2环境下常见的编码问题,结合你的代码和错误信息,我来一步步帮你排查和解决:

首先分析错误根源

错误信息 'ascii' codec can't decode byte 0xff in position 475: ordinal not in range(128) 本质是Python 2默认用ASCII编码处理字符串,但图片是二进制数据(包含ASCII范围外的字节),在异常处理时把错误信息转成ASCII字符串就触发了解码失败——你代码里的print str(e)就是问题点之一。

具体解决方案

1. 修复异常打印的编码问题(Python 2临时方案)

把视图里的print str(e)改成print unicode(e),这样会用Unicode来处理异常信息,避免ASCII解码错误:

except Exception as e:
    print unicode(e)

不过更推荐的是升级到Python 3,因为Python 3默认用UTF-8编码,从根源上避免这类编码问题。

2. 确保Ajax请求携带CSRF令牌

Django默认开启CSRF保护,你的Ajax代码里没加CSRF头,可能导致请求被拦截(虽然当前错误是编码,但先排除这个潜在问题)。修改JS代码:

// 先确保模板里有{% csrf_token %}生成的隐藏输入框
$.ajax({
    url: '/event/creatives/',
    type: 'POST',
    processData: false,
    contentType: false,
    dataType: 'json',
    headers: {
        'X-CSRFToken': $('input[name="csrfmiddlewaretoken"]').val()
    },
    data: dataimg
});

3. 优化Django视图的文件处理

在上传到Cloudinary之前,先确认文件是否被正确接收,并且用更稳妥的方式传递文件对象:

import cloudinary
import cloudinary.uploader
from django.core.files.uploadedfile import UploadedFile

cloudinary.config(
    cloud_name="name",
    api_key="key",
    api_secret="secret"
)

@login_required
def update_creatives(request):
    try:
        # 先检查文件是否存在
        if 'img' not in request.FILES:
            print("No file received in request")
            return HttpResponseBadRequest("Missing image file")
        
        img_file = request.FILES['img']
        # 验证文件类型
        if isinstance(img_file, UploadedFile):
            # 直接传递UploadedFile对象给Cloudinary
            cloudinary_response = cloudinary.uploader.upload(img_file)
            print("Upload success:", cloudinary_response)
        else:
            print("Invalid uploaded file type")
    except Exception as e:
        print unicode(e)  # Python 2用这个,Python 3直接print(e)

4. 测试简单文件排除特殊情况

尝试上传一张小的、无特殊元数据的图片(比如普通JPG),排除是特定图片文件的问题——有些图片的EXIF信息可能包含非ASCII字符,在Python 2下处理时容易触发编码错误。

总结

最核心的问题是Python 2的ASCII编码限制,升级到Python 3能彻底解决这类问题;同时别忘了Django的CSRF保护,确保Ajax请求能正常到达视图。

内容的提问来源于stack exchange,提问作者misss-popcorn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:50:28