1

我在尝试用回形针做一些不寻常的把戏时遇到了很大的麻烦。这是我的情况:我的应用程序用户有一个头像图像,我的想法是让他们通过 Jcrop 裁剪他们的头像。我的应用程序托管在 Heroku 中,因此我必须将图像上传到 Amazon S3。我使用这个流行的railscast来实现裁剪功能,但它需要处理两次图像。这是问题开始的地方。

我认为一个可行的解决方案可能不是第一次处理图像(当用户选择图像时),而是第二次处理。我已经在我的控制器中实现了这段代码:

    def change_avatar
      @user = current_user
      paperclip_parameters = params[:user][:avatar] #first time call

      if @temp_image_object.present? || params[:avatar].present?
        if check_crop_params  #second controller call
          @user.avatar = File.new(@user.tmp_avatar_path) #overrides the 
          redirect_to @user, notice: t("messages.update.user.avatar") if @user.save
        else    #first controller call
          @temp_path = @user.generate_temp_image(paperclip_parameters)
          @user.tmp_avatar_path = @new_path #store the custom path to retrieve it in the second call
          render :action => 'avatar_crop' if @user.save
        end
      end
    end

    def check_crop_params
      !params[:user][:crop_x].blank? && !params[:user][:crop_y].blank? && !params[:user][:crop_w].blank? && !params[:user][:crop_h ].blank?
    end

在我的用户模型中:

  #this method copies the original image tempfile when user upload the image to a custom path and returns the custom path
  def generate_temp_image(paperclip_parameters)
    uploaded_img_path = uploaded_img.tempfile.path

    temp_dir = Rails.root.join('public/tmp')
    Dir.mkdir(temp_dir) unless Dir.exists?(temp_dir)

    FileUtils.cp(uploaded_img.tempfile, temp_dir)

    new_path = uploaded_img_path
  end

我还有 jcrop 的自定义处理器,它在处理图像时采用裁剪变量。当我上传图像(第一个控制器调用)时,change_avatar 方法运行良好,但是当我裁剪图像(第二个控制器调用)时,图像没有被裁剪,回形针创建图像样式文件,但忽略了我所做的裁剪。

有任何想法吗?我该做什么?

4

2 回答 2

0

我忘记了一个小细节..查看服务器日志我意识到回形针过程没有裁剪图像,所以我查看了我的自定义处理器,我发现它取决于裁剪参数:crop_x、crop_y、crop_w、作物_h。由于某种原因,这个参数没有到达处理器,所以图像永远不会被裁剪。我所要做的就是手动将此参数分配给用户变量,它可以工作!

于 2013-03-29T14:11:30.857 回答
0

最好的策略是直接上传原始上传到 s3。本教程有一个示例,讲述上传到 S3 后如何运行回形针后处理方法。它还讨论了如何避免 Heroku H12 错误,以防 S3 上的后处理时间过长。

你也可以看看这篇文章。它有一个使用回形针和 jcrop 的演示代码。

于 2014-02-28T16:50:27.100 回答