【问题标题】:Wicked pdf only for certain routes邪恶的 pdf 仅适用于某些路线
【发布时间】:2020-06-12 19:24:58
【问题描述】:

我有路由/document/:email/:filename, :email => /.*/, :filename => /.*/,它只是获取文件名,在存储中搜索并返回它。但是,在我开始将 wicked_pdf 用于其他组件后,我的控制器中的 param[:filename] 停止识别 .pdf 扩展名。所以在 wicked_pdf 路由 /document/somemail@mail.com/myfile.pdf 在我的控制器上生成参数 param[:filename] == 'myfile.pdf' 之前,但是在我集成 wicked_pdf 之后,参数没有文件扩展名,即 param[:filename] == 'myfile' 如何避免这种行为? 我不希望 wicked_pdf 处理我的应用程序的所有 pdf 文件请求,仅针对特定路由/控制器

【问题讨论】:

    标签: ruby-on-rails wicked-pdf


    【解决方案1】:

    我相信这是因为在the Wicked PDF Railtie 中,它注册了这样的扩展:

    if Mime::Type.lookup_by_extension(:pdf).nil?
      Mime::Type.register('application/pdf', :pdf)
    end
    

    所以之前,:filename 只是一个路由参数,但现在 Rails 知道有一个匹配的扩展名,似乎它把它当作一个可以后跟扩展名的文件名,应该是 @987654327 @。

    你应该能够通过引用它来获得完整的文件名

    filename = [params[:filename], params[:format].compact.join('.')
    

    或者像这样取消注册 Mime 扩展(可能在 wicked_pdf 初始化程序中):

    Mime::Type.unregister(:pdf)
    

    也可能有一种方法可以修改您的路由通配符以将扩展名作为文件名的一部分包含在内,但与该主题相关的其他 StackOverflow 线程似乎不可能在文件名也包含句点的情况下做到这一点其中:

    【讨论】:

    • 嘿,谢谢,但我无法完成您的任何一个解决方案。获取请求是使用 URL 发出的,因此我无法设置适当的 mime 类型标头请求。取消注册 :pdf 也不起作用,因为中间件正在修改请求。看看我刚刚发布的解决方案
    • 在这里找到一篇关于如何在路由中允许点的博客文章:prathamesh.tech/2020/06/15/allowing-dots-in-rails-routes TL;DR:使用更容易接受的正则表达式指定您的参数,例如 post '/document/:id/:filename', filename: /[^\/]+/
    【解决方案2】:

    所以我发现中间件中去掉了pdf扩展名,但我也发现中间件可以得到一些条件,这样我们就可以知道什么时候用wicked_pdf处理文件,什么时候不处理。见https://github.com/mileszs/wicked_pdf/blob/3e0e2e7bd131365769d230c23ea17b4e52d2702f/lib/wicked_pdf/middleware.rb#L65

    然后在我的application.rb 上,我只是提出了这个条件:

        wickedpdfFormat = /wickedpdf_/
        config.middleware.use(WickedPdf::Middleware, {}, {:only => [wickedpdfFormat]})
    

    现在我只需要为我希望由 wicked_pdf 处理的文件包含 wickedpdf_ 前缀

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-30
      • 2017-09-13
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多