Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当mime类型为空时,Rails活动存储阻止上载_Javascript_Ruby On Rails - Fatal编程技术网

Javascript 当mime类型为空时,Rails活动存储阻止上载

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

我正在使用Rails 6中的直接上传和活动存储上传文件。上载
.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路由更改为您的操作,而不是原始()