你好——我尝试上传一个包含多个标签的 CSV 文件,但每次都会收到错误提示:“抱歉,上传该文件时出错。请重试。”
管理员面板中的日志显示:
消息(报告了 8 份副本)
未能正确处理劫持的响应:验证失败,名称无效
回溯
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/validations.rb:80:in `raise_validation_error'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/validations.rb:53:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/transactions.rb:318:in `block in save!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/transactions.rb:375:in `block in with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/database_statements.rb:278:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/transactions.rb:212:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/transactions.rb:366:in `with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/transactions.rb:318:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/suppressor.rb:48:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/persistence.rb:55:in `create!'
我尝试创建一个虚拟标签,即 CSV 文件中仅包含一个条目(例如单词 java),但仍收到相同的错误提示。
顺便提一下,我是按照官方安装指南在 DigitalOcean 上安装 Discourse 的,其他功能运行正常。
谢谢!
感谢 @codinghorror —— 如果您发现任何问题,请随时告知。如果有帮助的话,我目前运行的是 2.5.0.beta7 版本(14dc6f350e),部署在配备 4 GB 内存和 80 GB SSD 的 Droplet 上。
此外,我还安装了 akismet、formatting-toolbar 和 discourse-voting 插件。
tshenry
(Taylor)
4
我刚刚在 try.discourse.org 上测试了这一点。我用一个基本的文本编辑器创建了一个名为 tags.csv 的 CSV 文件,里面只包含单词 java,然后成功使用批量标签上传工具添加了新标签,没有任何问题。
try.discourse.org 网站启用了 Akismet 和 Discourse 投票功能,我高度怀疑格式化工具栏插件会以任何方式与你遇到的错误产生冲突。
在其他场景(如帖子、主题等)中,你能否正常上传文件?
你好 @tshenry —— 是的,如果这是你所问的,我可以在我发布的帖子中上传图片。
我已经销毁了 droplet 并重新安装了 Discourse,目前仅使用以下插件。
上传仍然失败。这是否与权限有关?我是该网站的管理员,按理说应该拥有执行此操作的所有权限。
这次我使用的是 2.5.0.beta7(70e50a2255)。
如果还有其他需要我尝试的操作,请告诉我。谢谢!
啊——我发现了有趣的事情 @codinghorror @tshenry。
如果标签文件命名为 tags-1.csv,上传会报错。如果命名为 tags.csv,标签上传就能成功 
这种命名方式是 Discourse 的要求(可能我漏看了相关说明),还是说这是一个 bug?
tshenry
(Taylor)
7
嗯,我尝试将文件重命名为 tags-1.csv,但依然无法复现该错误。如果您将其改回 tags-1.csv 并再次尝试上传,问题会再次出现吗?我在想,是否原始文件名中存在其他问题,而将其改为 tags.csv 恰好解决了这个问题。
不行,对我来说还是不行。我在 Mac 上做的只是:
$ vi tags-1.csv
然后按
i 进入编辑模式
输入 java
按 esc 退出编辑模式
输入 :wq 然后按回车保存并退出。
就这么简单。这也失败了。我起初以为可能是 Excel 导出为 CSV 的问题,但即使是命令行编辑也会报错。
我暂时继续使用 tags.csv,但如果您认为这很重要并希望我进行测试,我很乐意配合。同样的问题在两个全新安装的不同 droplet 上都发生了,这让我有些担心。
谢谢 @tshenry。
我发现了另一个问题(同样,不确定是否与我的环境有关)。我的标签是编程语言列表。我之前在标签列表中包含了 C++ 和 C#,但一旦我从 tags.csv 中移除了它们,批量上传就成功了。我在想这是否与标签以特殊字符结尾有关。也许又只是我这边的问题:man_shrugging:
这几乎肯定是问题所在。我在想,对于无效的标签,我们能否在这里返回一个更友好的错误提示?
tshenry
(Taylor)
11
是的!这绝对是问题所在。根据你上一帖的内容,我以为我们只处理文件中的 java 这个词。你需要使用类似 cpp、c-sharp 之类的语言标识。
没错,我觉得那样最理想。当前的错误提示对用户来说几乎没有提供任何有用的信息:
抱歉,上传文件时出错。请重试。
还有一个我此前不知晓的有趣细节:在正常创建或编辑主题时尝试创建标签,系统似乎会静默地移除所有符号。因此,输入 C++ 会被建议为标签 C。
我本想修改这段文案(以表明可能存在无效标签),但考虑到这段文案适用于所有上传场景,因此并不总是准确。
依我看,一个快速的方法是在“管理员设置”的“标签”部分添加几句话,说明标签名称的限制。
此外,或许可以在 Discourse 标签指南中增加一个警告(https://meta.discourse.org/t/a-comprehensive-guide-to-discourse-tags/121041)。
tshenry
(Taylor)
14
是的,这确实如此。我已经在标签上传代码中找到了抛出通用错误的位置,所以我会尝试在 PR 中为此情况创建一个更具体的错误。