【问题标题】:Laravel - file path to UploadedFile instanceLaravel - UploadedFile 实例的文件路径
【发布时间】:2014-11-07 18:46:49
【问题描述】:

我有一个 Laravel 4.2 API,它在创建资源时接受文件上传。该文件是用 Input::file('file')

现在我想编写一个脚本(也在 Laravel 中),它将批量创建一些资源(所以我不能使用 POST 到 API 端点的 HTML 表单)。如何将文件路径转换为 ​​UploadedFile 的实例,以便 Input::file('file') 在 API 中获取它?

【问题讨论】:

    标签: php laravel laravel-4 upload


    【解决方案1】:

    只需自己构建一个实例。 API 是:

    http://api.symfony.com/2.0/Symfony/Component/HttpFoundation/File/UploadedFile.html

    所以你应该可以做到:

    $file = new UploadedFile(
        '/absolute/path/to/file',
        'original-name.gif',
        'image/gif',
        1234,
        null,
        TRUE
    );
    

    注意:您必须将第 6 个构造参数指定为 TRUE,以便 UploadedFile 类知道您正在通过单元测试环境上传图像。

    【讨论】:

    • 使用这种方式,$file->isValid()返回false(因为is_uploaded_file()返回false);因此,在 API 中,我无法使用Input::file() 选择UploadedFile 实例,我也无法使用$file->move()。不过,您的回答为我指明了正确的方向,并且通过对 API 的一些细微调整,我设法解决了这个问题。谢谢!
    • 您必须将第 6 个构造参数指定为 TRUE,以便 UploadedFile 类知道您正在通过单元测试环境上传图像。
    • @Alexandros - 一年前它被标记为正确并被赞成,你确定这不仅仅是你自己代码的怪癖吗?示例:你能证明这是必需的吗?
    • 是的,我确定。 UploadedFile 构造函数是public function __construct($path, $originalName, $mimeType = null, $size = null, $error = null, $test = false) 如果您没有将 $test 作为 TRUE 传递,那么 phpunit 测试将失败。我认为@AlexandreThebaldi 也有同样的问题。
    • @Alexandros - 现在好像更新了。感谢您指出这一点。
    【解决方案2】:
      /**
       * Create an UploadedFile object from absolute path 
       *
       * @static
       * @param     string $path
       * @param     bool $public default false
       * @return    object(Symfony\Component\HttpFoundation\File\UploadedFile)
       * @author    Alexandre Thebaldi
       */
    
      public static function pathToUploadedFile( $path, $public = false )
      {
        $name = File::name( $path );
    
        $extension = File::extension( $path );
    
        $originalName = $name . '.' . $extension;
    
        $mimeType = File::mimeType( $path );
    
        $size = File::size( $path );
    
        $error = null;
    
        $test = $public;
    
        $object = new UploadedFile( $path, $originalName, $mimeType, $size, $error, $test );
    
        return $object;
      }
    

    【讨论】:

      【解决方案3】:

      这里是 Laravel 8.x 基于 Alexandre Thebaldi 的回答:

      use Illuminate\Filesystem\Filesystem;
      use Illuminate\Http\UploadedFile;
      
      /**
       * Create an UploadedFile object from absolute path 
       *
       * @param     string $path
       * @param     bool $test default true
       * @return    object(Illuminate\Http\UploadedFile)
       * 
       * Based of Alexandre Thebaldi answer here:
       * https://stackoverflow.com/a/32258317/6411540
       */
      public function pathToUploadedFile( $path, $test = true ) {
          $filesystem = new Filesystem;
          
          $name = $filesystem->name( $path );
          $extension = $filesystem->extension( $path );
          $originalName = $name . '.' . $extension;
          $mimeType = $filesystem->mimeType( $path );
          $error = null;
      
          return new UploadedFile( $path, $originalName, $mimeType, $error, $test );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-19
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多