Javascript 当mime类型为空时,Rails活动存储阻止上载
我正在使用Rails 6中的直接上传和活动存储上传文件。上载Javascript 当mime类型为空时,Rails活动存储阻止上载,javascript,ruby-on-rails,Javascript,Ruby On Rails,我正在使用Rails 6中的直接上传和活动存储上传文件。上载.stl文件时,我遇到以下错误Mime::Type::InvalidMimeType(“”不是有效的Mime类型),导致406错误 使用JS检查文件时,它也不会返回Mime类型。文件类型只是空的 我尝试过的所有.stl文件都是这样。图像文件按预期工作 我已经使用Mime::Type.register“model/stl”,:stl向rails初始值设定项添加了正确的Mimetype。但这当然没有什么区别 该文件是使用DirectUplo
.stl
文件时,我遇到以下错误Mime::Type::InvalidMimeType(“”不是有效的Mime类型)
,导致406错误
使用JS检查文件时,它也不会返回Mime类型。文件类型只是空的
我尝试过的所有.stl
文件都是这样。图像文件按预期工作
我已经使用Mime::Type.register“model/stl”,:stl
向rails初始值设定项添加了正确的Mimetype。但这当然没有什么区别
该文件是使用DirectUpload在JS中提交的
新建DirectUpload(文件、url、此)
没有文件验证
所以本质上我的问题是
- 为什么mimetype是空的
- 是否有其他方法验证文件类型
- 我可以在不引起安全问题的情况下设置mimetype吗
- 即使mimetype为空,我是否仍可以接受该文件
因此,问题似乎是ActiveStorage使用javascripts File.type方法来确定mime类型,这不太可靠(它只检查扩展名,看起来它取决于操作系统的设置) 由于您已经知道希望文件是什么mime类型,并且考虑到它已经使用了一种不太可靠的方法,我想如果文件扩展名是您要导出的文件扩展名,则可以手动设置文件类型 为了覆盖原始的直接上载操作,您可以创建一个新控制器来扩展原始控制器。在自定义控制器上,覆盖
create
操作,并设置params[:blob][:content\u type]
的值(如果为空),然后执行相同操作或调用super
要使DirectUpload使用您的控制器和操作,您需要更改DirectUpload使用的路由。只需使用相同的url为您的控制器添加一条新路线即可,只需澄清arieljuod回答的最后一段: 以源路由为前缀;覆盖路由必须包括完整路径。例如,要覆盖默认的创建操作,请执行以下操作:
post "/rails/active_storage/direct_uploads" => "your_controller_name#create"
从active storage的代码中,它使用
file.type
来获取内容类型(),如果使用dev工具调试变量,file.type
会返回什么?@arieljuod它是空的,很简单。从文档中看,您的浏览器(或您的系统,我不确定)不知道扩展名中的文件mime类型(这就是它为空的原因)。我想您可以覆盖通过直接上载调用的控制器操作,并设置所需的mime类型。请检查错误日志以获取控制器和操作。鉴于file.type返回的mime类型仅取决于扩展名,如果接收文件的扩展名为,我不会担心硬编码该mime类型。slt
@arieljuod很有趣,谢谢。我遇到了以下媒体类型列表:.STL在其中提到,所以我认为它应该可以工作。我在Chrome和Firefox中尝试过,两者都会导致相同的错误。在任何情况下,您对如何覆盖此操作有什么建议吗?目前我的控制器是非常基本的Rails,但文件从未达到这一点,所以我不确定要更改什么。控制台提到ActiveStorage::DirectUploadsController#create
。这是我可以用某种方式覆盖的吗?您可以创建自己的控制器,扩展ActiveStorage::DirectUploadsController,覆盖创建操作(复制原始文件并将mime_类型设置为内容_类型参数),然后将te路由更改为您的操作,而不是原始()