Gitlab (rails) "raw" .svg 文件的文件 MIME 类型是 'text/plain'。可以配置成输出为'image/svg+xml'吗?
Gitlab (rails) "raw" file mime type for .svg files is 'text/plain'. Can it be configured to output as 'image/svg+xml'?
我已经在本地服务器上安装了 Gitlab 用于评估,对我来说一个关键功能是让 svg 文件在 wiki 中显示为图像。如果我将一个文件拖到 wiki 编辑器中,它就会工作,它会生成一个 url,如下所示:
在维基降价中:
![my svg diagram](http://server/my-group/my-project/uploads/90cdd5d76a05957ab7cf8854c55a38b8/my-diagram.svg)
第 html 页的结果:
<img src="http://server/my-group/my-project/uploads/90cdd5d76a05957ab7cf8854c55a38b8/my-diagram.svg" alt="my svg diagram">
为了让它工作,我必须编辑 /opt/gitlab/embedded/service/gitlab-rails/config/initializers/mime_types.rb
以添加行:
Mime::Type.register_alias "image/svg+xml", :svg
如果我想将 svg 文件拖到 wiki 中并将其存储在项目的这个 'uploads' 部分,那很好,但是,我真正想做的是显示来自git 存储库。 (这样,例如,当 svg 图发生变化时,我不必在 wiki 中寻找它,它只会从 master 分支中获取它)
我发现,例如,这是一个 link 回购文件:
http://server/my-group/my-project/raw/master/docsfolder/my-drawing.svg
但是,对于以这种方式引用的 svg 文件,mime 类型似乎是 text/plain
,并且将不会显示带有 src
的图像。有没有办法让他们image/svg+xml
? mime_types.rb 配置文件似乎不影响此 "raw" 输出。还是有另一种方法可以 link 到 repo 文件并获取指定的 mime 类型?
我也尝试了 <object type="image/svg+xml" data="...
和 <embed type="image/svg+xml" src="
甚至 iframe,但是 none 这些都有效。
注意:它确实适用于存储库中的 jpg 图片,但不适用于 svg 图片。
找到了。内容类型似乎是在 raw_controller.rb 文件的 ruby 代码中设置的。所以我编辑
/opt/gitlab/embedded/service/gitlab-rails/app/controllers/projects/raw_controller.rb
改变这个:
def get_blob_type
if @blob.text?
'text/plain; charset=utf-8'
else
'application/octet-stream'
end
end
像这样:
def get_blob_type
extn = File.extname(@blob.name).downcase
if @blob.text?
if extn == ".svg"
'image/svg+xml'
else
'text/plain; charset=utf-8'
end
else
case extn
when ".jpg", ".jpeg"
'image/jpeg'
when ".gif"
'image/gif'
when ".png"
'image/png'
when ".bmp"
'image/bmp'
when ".tiff"
'image/tiff'
else
'application/octet-stream'
end
end
end
然后 sudo gitlab-ctrl restart
现在在我的降价中,如果我这样做:
![my-diagram](http://server/my-group/my-project/raw/master/docsfolder/my-drawing.svg)
有效!
我以前从未使用过 ruby,所以也许有更好的方法,但到目前为止对我有用。
101chris 的提议在 7.x 上运行良好,但在 gitlab 8.x 上需要一些修改。
这是我在 8.14.4 上测试的更新:
/opt/gitlab/embedded/service/gitlab-rails/app/helpers/blob_helper.rb :
def safe_content_type(blob)
if blob.text?
case File.extname(blob.name).downcase
when '.html'
'text/html'
when '.css'
'text/css'
when '.xml'
'text/xml'
when '.js'
'application/javascript'
else
'text/plain; charset=utf-8'
end
elsif blob.image?
blob.content_type
else
'application/octet-stream'
end
end
在 GitLab 11.7-CE 中出现您需要更新 /opt/gitlab/embedded/service/gitlab-rails/app/helpers/workhorse_helper.rb
并更改以下部分:
def send_git_blob(repository, blob, inline: true)
headers.store(*Gitlab::Workhorse.send_git_blob(repository, blob))
headers['Content-Disposition'] = inline ? 'inline' : 'attachment'
workhorse_set_content_type!
render plain: ""
end
以下(以“.html”为例):
def send_git_blob(repository, blob, inline: true)
headers.store(*Gitlab::Workhorse.send_git_blob(repository, blob))
headers['Content-Disposition'] = inline ? 'inline' : 'attachment'
if File.extname(@blob.name).downcase == '.html'
headers['Content-Type'] = 'text/html'
else
workhorse_set_content_type!
end
render plain: ""
end
正如其他人所说,出于安全原因,Content-Type
设置为 text/plain
,因为它可以保护您免受 XSS 攻击。如果您没有使用 GitLab 的受信任的封闭用户集,那么请不要这样做。
我已经在本地服务器上安装了 Gitlab 用于评估,对我来说一个关键功能是让 svg 文件在 wiki 中显示为图像。如果我将一个文件拖到 wiki 编辑器中,它就会工作,它会生成一个 url,如下所示:
在维基降价中:
![my svg diagram](http://server/my-group/my-project/uploads/90cdd5d76a05957ab7cf8854c55a38b8/my-diagram.svg)
第 html 页的结果:
<img src="http://server/my-group/my-project/uploads/90cdd5d76a05957ab7cf8854c55a38b8/my-diagram.svg" alt="my svg diagram">
为了让它工作,我必须编辑 /opt/gitlab/embedded/service/gitlab-rails/config/initializers/mime_types.rb
以添加行:
Mime::Type.register_alias "image/svg+xml", :svg
如果我想将 svg 文件拖到 wiki 中并将其存储在项目的这个 'uploads' 部分,那很好,但是,我真正想做的是显示来自git 存储库。 (这样,例如,当 svg 图发生变化时,我不必在 wiki 中寻找它,它只会从 master 分支中获取它)
我发现,例如,这是一个 link 回购文件:
http://server/my-group/my-project/raw/master/docsfolder/my-drawing.svg
但是,对于以这种方式引用的 svg 文件,mime 类型似乎是 text/plain
,并且将不会显示带有 src
的图像。有没有办法让他们image/svg+xml
? mime_types.rb 配置文件似乎不影响此 "raw" 输出。还是有另一种方法可以 link 到 repo 文件并获取指定的 mime 类型?
我也尝试了 <object type="image/svg+xml" data="...
和 <embed type="image/svg+xml" src="
甚至 iframe,但是 none 这些都有效。
注意:它确实适用于存储库中的 jpg 图片,但不适用于 svg 图片。
找到了。内容类型似乎是在 raw_controller.rb 文件的 ruby 代码中设置的。所以我编辑
/opt/gitlab/embedded/service/gitlab-rails/app/controllers/projects/raw_controller.rb
改变这个:
def get_blob_type
if @blob.text?
'text/plain; charset=utf-8'
else
'application/octet-stream'
end
end
像这样:
def get_blob_type
extn = File.extname(@blob.name).downcase
if @blob.text?
if extn == ".svg"
'image/svg+xml'
else
'text/plain; charset=utf-8'
end
else
case extn
when ".jpg", ".jpeg"
'image/jpeg'
when ".gif"
'image/gif'
when ".png"
'image/png'
when ".bmp"
'image/bmp'
when ".tiff"
'image/tiff'
else
'application/octet-stream'
end
end
end
然后 sudo gitlab-ctrl restart
现在在我的降价中,如果我这样做:
![my-diagram](http://server/my-group/my-project/raw/master/docsfolder/my-drawing.svg)
有效!
我以前从未使用过 ruby,所以也许有更好的方法,但到目前为止对我有用。
101chris 的提议在 7.x 上运行良好,但在 gitlab 8.x 上需要一些修改。 这是我在 8.14.4 上测试的更新:
/opt/gitlab/embedded/service/gitlab-rails/app/helpers/blob_helper.rb :
def safe_content_type(blob)
if blob.text?
case File.extname(blob.name).downcase
when '.html'
'text/html'
when '.css'
'text/css'
when '.xml'
'text/xml'
when '.js'
'application/javascript'
else
'text/plain; charset=utf-8'
end
elsif blob.image?
blob.content_type
else
'application/octet-stream'
end
end
在 GitLab 11.7-CE 中出现您需要更新 /opt/gitlab/embedded/service/gitlab-rails/app/helpers/workhorse_helper.rb
并更改以下部分:
def send_git_blob(repository, blob, inline: true)
headers.store(*Gitlab::Workhorse.send_git_blob(repository, blob))
headers['Content-Disposition'] = inline ? 'inline' : 'attachment'
workhorse_set_content_type!
render plain: ""
end
以下(以“.html”为例):
def send_git_blob(repository, blob, inline: true)
headers.store(*Gitlab::Workhorse.send_git_blob(repository, blob))
headers['Content-Disposition'] = inline ? 'inline' : 'attachment'
if File.extname(@blob.name).downcase == '.html'
headers['Content-Type'] = 'text/html'
else
workhorse_set_content_type!
end
render plain: ""
end
正如其他人所说,出于安全原因,Content-Type
设置为 text/plain
,因为它可以保护您免受 XSS 攻击。如果您没有使用 GitLab 的受信任的封闭用户集,那么请不要这样做。