<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>angryz</title>
    <link>https://ruby-china.org/angryz</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>[已解决] 使用 CarrierWave-Upyun 上传图片时发生 RestClient::Unauthorized (401 Unauthorized) 错误</title>
      <description>&lt;p&gt;2014.05.13 更新
该问题纯属自己粗心，犯了“下意识认为这部分没有问题”的错误，再次证明“你以为的并不一定就是你以为的那样”。
自己发现的结果在 &lt;a href="#reply6" class="at_floor" data-floor="6"&gt;#6 楼&lt;/a&gt;。惭愧！&lt;/p&gt;

&lt;p&gt;——————————————————&lt;/p&gt;
&lt;h3 id="运行环境"&gt;运行环境&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ruby 1.9.3&lt;/li&gt;
&lt;li&gt;rails 4.1.0&lt;/li&gt;
&lt;li&gt;carrierwave 0.10.0&lt;/li&gt;
&lt;li&gt;carrierwave-upyun 0.1.6&lt;/li&gt;
&lt;li&gt;rest-client 1.6.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="又拍云"&gt;又拍云&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;外链功能：开启&lt;/li&gt;
&lt;li&gt;表单功能：未开启&lt;/li&gt;
&lt;li&gt;HTTPS 功能：未开启&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;操作员授权，以及 &lt;code&gt;config/initializers/carrierwave.rb&lt;/code&gt; 配置都没有问题。&lt;/p&gt;
&lt;h3 id="问题说明"&gt;问题说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;之前使用 Rails 3.2.0 版本时图片上传正常&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;升级到 Rails 4.1.0 后修改 models 和 controllers 代码以遵循新特性，然后就出现了该错误&lt;/li&gt;
&lt;li&gt;该 Rails 应用主要是作为 Mobile App 的后端服务，由 App 通过 REST + JSON 方式调用&lt;/li&gt;
&lt;li&gt;Mobile App 将图片以 Base64 编码作为 JSON 的一个参数发送到 Rails 应用，Rails 里面解码后通过 carrierwave-upyun 进行上传，代码片段如下：
```ruby
class Auth &amp;lt; ActiveRecord::Base
belongs_to :user
has_secure_password
attr_accessor :uploader_secure_token
mount_uploader :avatar, ImageUploader&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;def image_data=(image_base64)
    unless image_base64.blank?
      data = StringIO.new(Base64.decode64(image_base64))
      data.class.class_eval { attr_accessor :original_filename, :content_type }
      data.original_filename = self.email + '.jpg'
      data.content_type = 'image/jpg'
      self.avatar = data
    end
  end
end&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
ImageUploader 是参考 @huacnlee 的 《[在 Rails 项目里面使用又拍云用于存储上传图片](http://huacnlee.com/blog/rails-app-image-store-with-carrierwave-upyun/#use-carrierwave)》 写的。

另外参考了帖子 《[关于又拍云的使用，undefined method 'uploader_secure_token'](http://ruby-china.org/topics/7132)》 也没有找到解决办法。

### 错误日志片段
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;D, [2014-05-10T14:47:28.897501 #67546] DEBUG -- : (BaseUploader.filename) bd3fdea8563a401c8b0accd61dd23a31
E, [2014-05-10T14:47:28.898015 #67546] ERROR -- : Binary data inserted for &lt;code&gt;string&lt;/code&gt; type on column &lt;code&gt;password_digest&lt;/code&gt;
D, [2014-05-10T14:47:28.898240 #67546] DEBUG -- :   SQL (0.1ms)  INSERT INTO "auths" ("avatar", "created_at", "nickname", "password_digest", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?, ?)  [["avatar", "bd3fdea8563a401c8b0accd61dd23a31.jpg"], ["created_at", "2014-05-10 06:47:28.897638"], ["nickname", "foobar1"], ["password_digest", "$2a$10$/NJLntYAY2pZiZ.06zkTPusCZa5g0vcRKPm93BmEBCGv9XIX1FAwO"], ["updated_at", "2014-05-10 06:47:28.897638"], ["user_id", 33]]
D, [2014-05-10T14:47:28.898455 #67546] DEBUG -- : (BaseUploader.filename) bd3fdea8563a401c8b0accd61dd23a31
D, [2014-05-10T14:47:30.463842 #67546] DEBUG -- :    (6.4ms)  rollback transaction
I, [2014-05-10T14:47:30.464289 #67546]  INFO -- : Completed 500 Internal Server Error in 1645ms
F, [2014-05-10T14:47:30.466549 #67546] FATAL -- :
RestClient::Unauthorized (401 Unauthorized):
  app/controllers/users_controller.rb:47:in `create'&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
__这个问题我Google了半天，在stackoverflow上看了好几个相关的问题，都没有找到解决办法，烦请各位帮忙看看，谢谢！__
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>angryz</author>
      <pubDate>Sat, 10 May 2014 15:36:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/19152</link>
      <guid>https://ruby-china.org/topics/19152</guid>
    </item>
  </channel>
</rss>
