Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
e6d2e8bf
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e6d2e8bf
编写于
7月 28, 2019
作者:
P
Peter Zhu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Upload file with filename and disposition for S3
上级
efa2299a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
26 addition
and
7 deletion
+26
-7
activestorage/lib/active_storage/service/s3_service.rb
activestorage/lib/active_storage/service/s3_service.rb
+9
-7
activestorage/test/service/s3_service_test.rb
activestorage/test/service/s3_service_test.rb
+17
-0
未找到文件。
activestorage/lib/active_storage/service/s3_service.rb
浏览文件 @
e6d2e8bf
...
...
@@ -20,12 +20,14 @@ def initialize(bucket:, upload: {}, **options)
@upload_options
=
upload
end
def
upload
(
key
,
io
,
checksum:
nil
,
content_type
:
nil
,
**
)
def
upload
(
key
,
io
,
checksum:
nil
,
filename:
nil
,
content_type:
nil
,
disposition
:
nil
,
**
)
instrument
:upload
,
key:
key
,
checksum:
checksum
do
content_disposition
=
content_disposition_with
(
filename:
filename
,
type:
disposition
)
if
disposition
&&
filename
if
io
.
size
<
multipart_upload_threshold
upload_with_single_part
key
,
io
,
checksum:
checksum
,
content_type:
content_type
upload_with_single_part
key
,
io
,
checksum:
checksum
,
content_type:
content_type
,
content_disposition:
content_disposition
else
upload_with_multipart
key
,
io
,
content_type:
content_type
upload_with_multipart
key
,
io
,
content_type:
content_type
,
content_disposition:
content_disposition
end
end
end
...
...
@@ -103,16 +105,16 @@ def headers_for_direct_upload(key, content_type:, checksum:, **)
MAXIMUM_UPLOAD_PARTS_COUNT
=
10000
MINIMUM_UPLOAD_PART_SIZE
=
5
.
megabytes
def
upload_with_single_part
(
key
,
io
,
checksum:
nil
,
content_type:
nil
)
object_for
(
key
).
put
(
body:
io
,
content_md5:
checksum
,
content_type:
content_type
,
**
upload_options
)
def
upload_with_single_part
(
key
,
io
,
checksum:
nil
,
content_type:
nil
,
content_disposition:
nil
)
object_for
(
key
).
put
(
body:
io
,
content_md5:
checksum
,
content_type:
content_type
,
content_disposition:
content_disposition
,
**
upload_options
)
rescue
Aws
::
S3
::
Errors
::
BadDigest
raise
ActiveStorage
::
IntegrityError
end
def
upload_with_multipart
(
key
,
io
,
content_type:
nil
)
def
upload_with_multipart
(
key
,
io
,
content_type:
nil
,
content_disposition:
nil
)
part_size
=
[
io
.
size
.
fdiv
(
MAXIMUM_UPLOAD_PARTS_COUNT
).
ceil
,
MINIMUM_UPLOAD_PART_SIZE
].
max
object_for
(
key
).
upload_stream
(
content_type:
content_type
,
part_size:
part_size
,
**
upload_options
)
do
|
out
|
object_for
(
key
).
upload_stream
(
content_type:
content_type
,
content_disposition:
content_disposition
,
part_size:
part_size
,
**
upload_options
)
do
|
out
|
IO
.
copy_stream
(
io
,
out
)
end
end
...
...
activestorage/test/service/s3_service_test.rb
浏览文件 @
e6d2e8bf
...
...
@@ -77,6 +77,23 @@ class ActiveStorage::Service::S3ServiceTest < ActiveSupport::TestCase
@service
.
delete
key
end
test
"upload with content disposition"
do
key
=
SecureRandom
.
base58
(
24
)
data
=
"Something else entirely!"
@service
.
upload
(
key
,
StringIO
.
new
(
data
),
checksum:
Digest
::
MD5
.
base64digest
(
data
),
filename:
ActiveStorage
::
Filename
.
new
(
"cool_data.txt"
),
disposition: :attachment
)
assert_equal
(
"attachment; filename=
\"
cool_data.txt
\"
; filename*=UTF-8''cool_data.txt"
,
@service
.
bucket
.
object
(
key
).
content_disposition
)
ensure
@service
.
delete
key
end
test
"uploading a large object in multiple parts"
do
service
=
build_service
(
upload:
{
multipart_threshold:
5
.
megabytes
})
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录