# Active Storage
Active Storage makes it simple to upload and reference files in cloud services like [Amazon S3](https://aws.amazon.com/s3/), [Google Cloud Storage](https://cloud.google.com/storage/docs/), or [Microsoft Azure Storage](https://azure.microsoft.com/en-us/services/storage/), and attach those files to Active Records. Supports having one main service and mirrors in other services for redundancy. It also provides a disk service for testing or local deployments, but the focus is on cloud storage.
Files can be uploaded from the server to the cloud or directly from the client to the cloud.
Image files can furthermore be transformed using on-demand variants for quality, aspect ratio, size, or any other [MiniMagick](https://github.com/minimagick/minimagick) or [Vips](https://www.rubydoc.info/gems/ruby-vips/Vips/Image) supported transformation.
You can read more about Active Storage in the [Active Storage Overview](https://guides.rubyonrails.org/active_storage_overview.html) guide.
## Compared to other storage solutions
A key difference to how Active Storage works compared to other attachment solutions in \Rails is through the use of built-in [Blob](https://github.com/rails/rails/blob/main/activestorage/app/models/active_storage/blob.rb) and [Attachment](https://github.com/rails/rails/blob/main/activestorage/app/models/active_storage/attachment.rb) models (backed by Active Record). This means existing application models do not need to be modified with additional columns to associate with files. Active Storage uses polymorphic associations via the `Attachment` join model, which then connects to the actual `Blob`.
`Blob` models store attachment metadata (filename, content-type, etc.), and their identifier key in the storage service. Blob models do not store the actual binary data. They are intended to be immutable in spirit. One file, one blob. You can associate the same blob with multiple application models as well. And if you want to do transformations of a given `Blob`, the idea is that you'll simply create a new one, rather than attempt to mutate the existing one (though of course you can delete the previous version later if you don't need it).
## Installation
Run `bin/rails active_storage:install` to copy over active_storage migrations.
NOTE: If the task cannot be found, verify that `require "active_storage/engine"` is present in `config/application.rb`.
## Examples
One attachment:
```ruby
class User < ApplicationRecord
# Associates an attachment and a blob. When the user is destroyed they are
# purged by default (models destroyed, and resource files deleted).
has_one_attached :avatar
end
# Attach an avatar to the user.
user.avatar.attach(io: File.open("/path/to/face.jpg"), filename: "face.jpg", content_type: "image/jpeg")
# Does the user have an avatar?
user.avatar.attached? # => true
# Synchronously destroy the avatar and actual resource files.
user.avatar.purge
# Destroy the associated models and actual resource files async, via Active Job.
user.avatar.purge_later
# Does the user have an avatar?
user.avatar.attached? # => false
# Generate a permanent URL for the blob that points to the application.
# Upon access, a redirect to the actual service endpoint is returned.
# This indirection decouples the public URL from the actual one, and
# allows for example mirroring attachments in different services for
# high-availability. The redirection has an HTTP expiration of 5 min.
url_for(user.avatar)
class AvatarsController < ApplicationController
def update
# params[:avatar] contains an ActionDispatch::Http::UploadedFile object
Current.user.avatar.attach(params.require(:avatar))
redirect_to Current.user
end
end
```
Many attachments:
```ruby
class Message < ApplicationRecord
has_many_attached :images
end
```
```erb
<%= form_with model: @message, local: true do |form| %>
<%= form.text_field :title, placeholder: "Title" %><br>
<%= form.textarea :content %><br><br>
<%= form.file_field :images, multiple: true %><br>
<%= form.submit %>
<% end %>
```
```ruby
class MessagesController < ApplicationController
def index
# Use the built-in with_attached_images scope to avoid N+1
@messages = Message.all.with_attached_images
end
def create
message = Message.create! params.require(:message).permit(:title, :content, images: [])
redirect_to message
end
def show
@message = Message.find(params[:id])
end
end
```
Variation of image attachment:
```erb
<%# Hitting the variant URL will lazy transform the original blob and then redirect to its new service location %>
<%= image_tag user.avatar.variant(resize_to_limit: [100, 100]) %>
```
## File serving strategies
Active Storage supports two ways to serve files: redirecting and proxying.
### Redirecting
Active Storage generates stable application URLs for files which, when accessed, redirect to signed, short-lived service URLs. This relieves application servers of the burden of serving file data. It is the default file serving strategy.
When the application is configured to proxy files by default, use the `rails_storage_redirect_path` and `_url` route helpers to redirect instead:
```erb
<%= image_tag rails_storage_redirect_path(@user.avatar) %>
```
### Proxying
Optionally, files can be proxied instead. This means that your application servers will download file data from the storage service in response to requests. This can be useful for serving files from a CDN.
You can configure Active Storage to use proxying by default:
```ruby
# config/initializers/active_storage.rb
Rails.application.config.active_storage.resolve_model_to_route = :rails_storage_proxy
```
Or if you want to explicitly proxy specific attachments there are URL helpers you can use in the form of `rails_storage_proxy_path` and `rails_storage_proxy_url`.
```erb
<%= image_tag rails_storage_proxy_path(@user.avatar) %>
```
## Direct uploads
Active Storage, with its included JavaScript library, supports uploading directly from the client to the cloud.
### Direct upload installation
1. Include the Active Storage JavaScript in your application's JavaScript bundle or reference it directly.
Requiring directly without bundling through the asset pipeline in the application HTML with autostart:
```erb
<%= javascript_include_tag "activestorage" %>
```
Requiring via importmap-rails without bundling through the asset pipeline in the application HTML without autostart as ESM:
```ruby
# config/importmap.rb
pin "@rails/activestorage", to: "activestorage.esm.js"
```
```html
<script type="module-shim">
import * as ActiveStorage from "@rails/activestorage"
ActiveStorage.start()
</script>
```
Using the asset pipeline:
```js
//= require activestorage
```
Using the npm package:
```js
import * as ActiveStorage from "@rails/activestorage"
ActiveStorage.start()
```
2. Annotate file inputs with the direct upload URL.
```erb
<%= form.file_field :attachments, multiple: true, direct_upload: true %>
```
3. That's it! Uploads begin upon form submission.
### Direct upload JavaScript events
| Event name | Event target | Event data (`event.detail`) | Description |
| --- | --- | --- | --- |
| `direct-uploads:start` | `<form>` | None | A form containing files for direct upload fields was submitted. |
| `direct-upload:initialize` | `<input>` | `{id, file}` | Dispatched for every file after form submission. |
| `direct-upload:start` | `<input>` | `{id, file}` | A direct upload is starting. |
| `direct-upload:before-blob-request` | `<input>` | `{id, file, xhr}` | Before making a request to your application for direct upload metadata. |
| `direct-upload:before-storage-request` | `<input>` | `{id, file, xhr}` | Before making a request to store a file. |
| `direct-upload:progress` | `<input>` | `{id, file, progress}` | As requests to store files progress. |
| `direct-upload:error`
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
什么是 Rails? Rails 是一个 Web 应用程序框架,它包含根据 模型-视图-控制器 (MVC) 模式创建数据库支持的 Web 应用程序所需的一切。 理解 MVC 模式是理解 Rails 的关键。MVC 将应用程序分为三层:模型、视图和控制器,每层都有特定的职责。 模型层 模型层代表领域模型(例如帐户、产品、人员、帖子等),并封装特定于应用程序的业务逻辑。在 Rails 中,数据库支持的模型类派生自 ActiveRecord::Base。Active Record允许您将数据库行中的数据显示为对象,并使用业务逻辑方法修饰这些数据对象。虽然大多数 Rails 模型都由数据库支持,但模型也可以是普通的 Ruby 类,或者是实现Active Model模块提供的一组接口的 Ruby 类。
资源推荐
资源详情
资源评论
收起资源包目录
Ruby on Rails (2000个子文件)
binary_file 19KB
boundary_problem_file 10KB
application-a71b3024f80aea3181c09774ca17e712.js.br 34KB
application-a71b3024f80aea3181c09774ca17e712.js.br 34KB
bracketed_param 78B
bracketed_utf8_param 173B
Brewfile 208B
hello_xml_world.builder 141B
xml_fragment_cached_with_html_partial.xml.builder 87B
formatted_fragment_cached.xml.builder 65B
builder.builder 34B
using_defaults.xml.builder 21B
using_defaults_with_type_list.xml.builder 21B
render_default_for_builder.builder 21B
implicit_content_type.atom.builder 16B
CODEOWNERS 30B
console 395B
console 182B
trix.css 20KB
actiontext.css 1KB
scaffold.css 1005B
scaffold.css 1005B
fsm.css 809B
application.css 753B
application.css 736B
stylesheets.css 736B
application.css 736B
epub.css 243B
messages.css 128B
baz.css 27B
baz.css 27B
baz.css 27B
version.1.0.css 21B
subdir.css 17B
robber.css 16B
bank.css 14B
file.css 12B
Dockerfile 2KB
.document 0B
welcome.eml 45KB
invalid_utf.eml 1KB
empty 191B
.empty_directory 0B
index.html.erb 10KB
layout.html.erb 7KB
_table.html.erb 6KB
email.html.erb 5KB
layout.erb 5KB
_trace.html.erb 2KB
rails_guides.opf.erb 2KB
toc.ncx.erb 2KB
index.html.erb 2KB
_welcome.html.erb 2KB
index.html.erb 2KB
diagnostics.html.erb 2KB
release_announcement_draft.erb 1KB
_source.html.erb 1KB
new.html.erb 1KB
notes.html.erb 1KB
missing_exact_template.html.erb 1KB
index.html.erb 1KB
invalid_statement.html.erb 1KB
application.html.erb 928B
routing_error.html.erb 837B
invalid_statement.text.erb 787B
_request_and_response.html.erb 776B
_form.html.erb 773B
template_error.html.erb 762B
_message_and_suggestions.html.erb 760B
_request_and_response.text.erb 688B
index.html.erb 683B
index.html.erb 634B
toc.html.erb 626B
new.html.erb 612B
_blob.html.erb 605B
layout.html.erb 593B
show.html.erb 580B
index.html.erb 576B
blocked_host.html.erb 558B
edit.html.erb 511B
mailer.html.erb 507B
template_error.text.erb 441B
_route.html.erb 440B
diagnostics.text.erb 439B
blocked_host.text.erb 419B
missing_template.html.erb 396B
new.html.erb 386B
new.html.erb 370B
_actions.html.erb 366B
_source.text.erb 326B
show.html.erb 318B
application.html.erb 317B
routing_error.text.erb 308B
block_with_layout.erb 305B
_remote_image.html.erb 295B
_license.html.erb 282B
application.html.erb 280B
partial_with_layout.erb 257B
welcome.html.erb 250B
mailer.html.erb 227B
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
余十步
- 粉丝: 1677
- 资源: 172
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功