Amazon S3 принимает только файлы без пробелов, без цифр в заголовке? - PullRequest
3 голосов
/ 12 декабря 2010

Это странный вопрос, но только соразмерный странному поведению, которое я вижу. Мое приложение - Rails 3 / Paperclip / S3.

Симптомы:

  • Все изображения загружаются независимо от их названия.
  • При загрузке .pdf или .doc, если в заголовке нет пробелов, таких как my_doc.pdf, он загружается нормально.
  • При загрузке .pdf или .doc с пробелами, такими как My Doc.pdf, происходит сбой либо с ошибкой broken pipe, либо из-за того, что файл молча не удается загрузить на S3.
  • При загрузке .pdf или .doc с номерами, такими как mydoc20.pdf, он также завершается с ошибкой, как указано выше.

Я полагаю, есть два возможных решения этой проблемы.

  1. Исправьте ошибку broken pipe напрямую (предпочтительный метод).
  2. Автоматически переименовывает каждый загруженный файл, чтобы удалить пробелы и цифры, прежде чем он будет сохранен в S3 - хотя я не исправляю его в источнике, я думаю, что это разрешит проблему.

Я был бы очень признателен за любую помощь, которую вы можете оказать мне в исправлении 1 и / или 2.


код

# Upload.rb model
class Upload < ActiveRecord::Base
  has_attached_file :document,
    :storage => :s3,
    :s3_credentials => "#{::Rails.root.to_s}/config/s3.yml",
    :path => "/docs/:style/:id/:basename.:extension"
  has_attached_file :photo,
    :styles => {:medium => "200x300>", :thumb => "100x150>" },
    :storage => :s3,
    :s3_credentials => "#{::Rails.root.to_s}/config/s3.yml",
    :path => "/photos/:style/:id/:basename.:extension"

# s3.yml
development:
  bucket: dev_bucket_name
  access_key_id: dev_acc_key
  secret_access_key: dev_sec_key
production:
  bucket: my_production_bucket
  access_key_id: my_access_key_id
  secret_access_key: my_secret_key

# environment.rb is empty with regard to uploading.

# uploads_controller.rb
def edit
  @candidate = Candidate.find(current_user.user_type_id)
  render :layout => 'forms'
end

def update
  @candidate = Candidate.find(params[:id])
  if @candidate.update_attributes(params[:candidate])
    flash[:notice] = "Profile updated successfully."
    redirect_to :action => "show", :id => params[:id]
  else
    flash[:notice] = "There was an error updating your profile."
    render :action => "edit", :id => params[:id]
  end
end

Я не верю, что существуют какие-либо методы. Я почти надеюсь, что с моим подходом что-то явно не так, потому что это значит, что он будет исправлен:).

1 Ответ

4 голосов
/ 12 декабря 2010

Для второй части это должно быть сделано:

@s = "Really Important!*() Document version#123123.newest.pdf"
@s.gsub!(' ','_').downcase! #this will make everything lowercase and replace all spaces with underscores
@s.gsub!(/[^a-zA-Z._]+/,'') #this will remove all numbers and special characters except . and _
puts @s #prints "really_important_document_version.newest.pdf"

Редактировать: После дополнительного исследования скрепки я обнаружил следующее: http://blog.wyeworks.com/2009/7/13/paperclip-file-rename

Проверьтессылка, я думаю, это то, что вы ищете.

Редактировать 2: В моем первоначальном прочтении вашего поста я пропустил часть о извлечении чисел, я изменилРегулярный код выражения для учета этого.

...