Сохранение файлов с помощью Скрепки без загрузки

Используйте перемещение svn , чтобы переместить содержание старой соединительной линии где-то в другом месте и переименовать ответвление для транкинга позже.

Примечание, которые копируют и перемещаются в работу svn как операции файла. Можно использовать их для перемещений/копирования материала вокруг в репозиторий, и эти изменения являются имеющими версию также. Думайте о "перемещении" как "copy+delete".

[РЕДАКТИРОВАНИЕ] Nilbus просто уведомил меня, что Вы получите конфликты слияния, когда Вы будете использовать svn move.

я все еще думаю, что это - корректный подход. Это вызовет конфликты, но если Вы объединяетесь тщательно, возможности состоят в том, что Вы не потеряете данных. Если это беспокоит Вас, используйте лучший VCS как Подвижный или Мерзавец .

33
задан Mayur Shah 18 April 2017 в 11:41
поделиться

2 ответа

У меня есть задача rake, которая загружает изображения (клиентские логотипы) из каталога непосредственно в parperclip. Вы, вероятно, сможете адаптировать его под свои нужды.

Это моя упрощенная модель клиента:

class Client < ActiveRecord::Base
  LOGO_STYLES = {
    :original => ['1024x768>', :jpg],
    :medium   => ['256x192#', :jpg],
    :small    => ['128x96#', :jpg]
  }

  has_attached_file :logo,
    :styles => Client::LOGO_STYLES,
    :url => "/clients/logo/:id.jpg?style=:style"
  attr_protected :logo_file_name, :logo_content_type, :logo_size

Затем на моем задании с граблями я делаю следующее:

# the logos are in a folder with path logos_dir
Dir.glob(File.join(logos_dir,'*')).each do |logo_path|
  if File.basename(logo_path)[0]!= '.' and !File.directory? logo_path

    client_code = File.basename(logo_path, '.*') #filename without extension
    client = Client.find_by_code(client_code) #you could use the ids, too
    raise "could not find client for client_code #{client_code}" if client.nil?

    File.open(logo_path) do |f|
      client.logo = f # just assign the logo attribute to a file
      client.save
    end #file gets closed automatically here
  end
end

С уважением!

49
ответ дан 27 November 2019 в 18:14
поделиться

Файл, сохраненный в Paperclip, не нужно загружать напрямую через форму.

Я использую Paperclip в проекте для сохранения файлов с URL-адресов из результатов веб-сканера. Я не уверен, как вы получите вложения электронной почты (находятся ли они в локальной файловой системе сервера? Является ли ваше приложение почтовым приложением, например GMail?), Но если вы можете получить поток файлов (через что-то вроде open (URI.parse (crawl_result)) в моем случае ...) вы можете прикрепить этот файл к полю модели, помеченному has_attached_file .

Это сообщение в блоге о Простая загрузка через URL-адрес с помощью скрепки помогло мне разобраться в этом.

Поскольку теперь кажется, что исходное сообщение в блоге больше не доступно - вот его суть, извлеченная из машины обратного пути :

В этом примере показана модель фотографии с вложенным изображением.

Используемый нами метод требует добавления столбца * _ remote_url (строка) для вашего вложения, который используется для хранения оригинала. URL. Итак, в этом случае нам нужно добавить столбец с именем image_remote_url в таблицу фотографий.

# db/migrate/20081210200032_add_image_remote_url_to_photos.rb

class AddImageRemoteUrlToPhotos < ActiveRecord::Migration
  def self.up
    add_column :photos, :image_remote_url, :string
  end

  def self.down
    remove_column :photos, :image_remote_url
  end
end

Для контроллера ничего особенного не требуется ...

# app/controllers/photos_controller.rb

class PhotosController < ApplicationController

  def create
    @photo = Photo.new(params[:photo])
    if @photo.save
      redirect_to photos_path
    else
      render :action => 'new'
    end
  end

end

В форму мы добавляем текстовое поле с именем : image_url , чтобы люди могли загрузить файл или предоставить URL ...

# app/views/photos/new.html.erb

<%= error_messages_for :photo %>
<% form_for :photo, :html => { :multipart => true } do |f| %>
  Upload a photo: <%= f.file_field :image %><br>
  ...or provide a URL: <%= f.text_field :image_url %><br>
  <%= f.submit 'Submit' %>
<% end %>

Самое главное - это модель Фото. Нам нужно потребовать open-uri , добавить attr_accessor: image_url и выполнить обычные действия has_attached_file . Потом, мы добавляем обратный вызов before_validation для загрузки файла в атрибут image_url (если он указан) и сохраняем исходный URL как image_remote_url . Наконец, мы делаем validates_presence_of: image_remote_url , что позволяет нам спастись от множества исключений, которые могут возникнуть при попытке загрузить файл.

# app/models/photo.rb

require 'open-uri'

class Photo < ActiveRecord::Base

  attr_accessor :image_url

  has_attached_file :image # etc...

  before_validation :download_remote_image, :if => :image_url_provided?

  validates_presence_of :image_remote_url, :if => :image_url_provided?, :message => 'is invalid or inaccessible'

private

  def image_url_provided?
    !self.image_url.blank?
  end

  def download_remote_image
    self.image = do_download_remote_image
    self.image_remote_url = image_url
  end

  def do_download_remote_image
    io = open(URI.parse(image_url))
    def io.original_filename; base_uri.path.split('/').last; end
    io.original_filename.blank? ? nil : io
  rescue # catch url errors with validations instead of exceptions (Errno::ENOENT, OpenURI::HTTPError, etc...)
  end

end

Все будет работать как обычно, включая создание эскизов, и т.д. Кроме того, поскольку мы делаем все сложные вещи в модели, «загрузка» файла по URL-адресу также работает из скрипта / консоли:

$ script/console
Loading development environment (Rails 2.2.2)
>> Photo.new(:image_url => 'http://www.google.com/intl/en_ALL/images/logo.gif')
=> #<Photo image_file_name: "logo.gif", image_remote_url: "http://www.google.com/intl/en_ALL/images/logo.gif">
11
ответ дан 27 November 2019 в 18:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: