【问题标题】:Can't store Data URI to database without stripping + characters无法在不剥离 + 字符的情况下将数据 URI 存储到数据库
【发布时间】:2011-02-05 18:48:26
【问题描述】:

我正在尝试使用 URI 方案中的 src 获取对图像的引用。 google.com/news 上的图片就是一个例子。

如果我提醒(escape(saveObj.image));我得到如下信息:

data%3Aimage/jpeg%3Bbase64%2C/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABQAFADASIAAhEBAxEB/8QAHAAAAQUBAQEAAAAAAAAAAAAABgIDBAUHAQAI/8QAPhAAAgECBAMFBgIGCwEAAAAAAQIDBBEABRIhEzFhBkFRcYEUIjKRobFCwRUjJFKC0QcWJSZiY3Jzg7Lw4f/EABoBAAIDAQEAAAAAAAAAAAAAAAMEAAIFBgH/xAAmEQABBAEEAQMFAAAAAAAAAAABAAIDESEEEjFBBRMisVFhcZGh/9oADAMBAAIRAxEAPwAr7L5pD2gyY5JXEtLGAFY/EU2sR1U2+nXF/pZFKuffViGPW5ximQUEz1cNdPNKms6g8TlWBufDcHyxsdLUmqoYqhiWZ1BYtsSe+/

我从 js 文件中传递它,并使用 django 使用 modelform.save 将其放入 utf8_unicode_ci 类型的 mysql 表中,但是当我检查数据库中的内容时,我看到了:

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABQAFADASIAAhEBAxEB/8QAHAAAAQUBAQEAAAAAAAAAAAAABgIDBAUHAQAI/8QAPhAAAgECBAMFBgIGCwEAAAAAAQIDBBEABRIhEzFhBkFRcYEUIjKRobFCwRUjJFKC0QcWJSZiY3Jzg7Lw4f/EABoBAAIDAQEAAAAAAAAAAAAAAAMEAAIFBgH/xAAmEQABBAEEAQMFAAAAAAAAAAABAAIDESEEEjFBBRMisVFhcZGh/9oADAMBAAIRAxEAPwAr7L5pD2gyY5JXEtLGAFY/EU2sR1U2 nXF/pZFKuffViGPW5ximQUEz1cNdPNKms6g8TlWBufDcHyxsdLUmqoYqhiWZ1BYtsSe 

主要区别在于,在我的数据库中,原始数据库中的所有“+”字符都已被删除并替换为空格。有任何想法吗?我要瞎了眼才想明白! :P

在通过 xmlhttprequest(POST,webservice,TRUE)传递给 webservice 之前,我在 src 上执行的唯一 javascript 是:

escape(image) where image = src of a google news image.

【问题讨论】:

    标签: mysql database django uri


    【解决方案1】:

    问题在于 Django URLFields 会自动传递给 urlsplit 方法,并且会删除此类内容,因为 + 也意味着 url 中的空格。

    如您所见here,URLField 的验证会自动执行此操作。因此,您可以改用CharField,也可以像这样创建自定义URLField

    class CustomURLField(forms.URLField):
        def to_python(self, value):
            return value
    

    请注意,如果您这样做,它不会再自动添加 http。

    【讨论】:

    • 感谢您的快速回复。我实际上正在使用: img_link = models.TextField(null=True, blank=True) 因为我不确定 base64 img 链接有多大(它们看起来很大)。使用models.TextField,是否有类似的约束?我似乎找不到会出现这种情况的原因。
    • @citizencane:你的表格是什么样的?我猜有些转义在某处是不正确的。另外,请注意escape()encodeURI() 不同。
    • 对于该字段,表单是 class Copies(models.Model): img_link = models.CharField(null = True, blank=True, max_length = 3500)
    • @citizencane:我已经在本地尝试过,但我根本无法重现它,所以我猜测您的 javascript 错误地转义了它。您可以将相关的 javascript/html 部分添加到您的问题中吗?
    • 奇怪的是,我正在执行的唯一 JS 是 escape(image),(也在上面的编辑中)其中 image 是 google 新闻图像 URI 的 src。发出警报会显示 + 字符。我通过 xmlhttprequest('post',webserviceurl,true) 将它发送到网络服务
    【解决方案2】:

    由于 URL 中的+ 表示空格,因此空格很好,只要在查询服务器之前再次对 URL 进行编码即可。看起来它也在删除尾部斜杠。

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2017-01-12
      • 2021-08-22
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 2013-08-29
      相关资源
      最近更新 更多