【问题标题】:Apache application/octet-stream create an empty fileApache application/octet-stream 创建一个空文件
【发布时间】:2016-11-15 05:07:28
【问题描述】:

我尝试使用 Xamarin.Forms 应用程序将文件上传到服务器。

var content = new MultipartFormDataContent();
content.Add(new StreamContent(new MemoryStream(img)), "file", "image.jpg");
httpClient.PostAsync(uri, MultipartFormDataContent);

我使用 PHP 和 Symfony UploadedFile 类在服务器上接收文件。 这部分在我的本地主机(macOS Sierra Version 10.12.1/Apache/2.4.23 (Unix))上运行良好,当我进行测试时,我能够接收文件:

"file" => UploadedFile {#217 ▼
    -test: false
    -originalName: "image.jpg"
    -mimeType: "application/octet-stream"
    -size: 8112955
    -error: 0
    path: "/Applications/MAMP/tmp/php"
    filename: "phpWyUBHM"
    basename: "phpWyUBHM"
    pathname: "/Applications/MAMP/tmp/php/phpWyUBHM"
    extension: ""
    realPath: "/Applications/MAMP/tmp/php/phpWyUBHM"
    writable: false
    readable: false
    executable: false
    file: false
    dir: false
    link: false
  }

Apache 配置:

upload_max_filesize 32M 32M
post_max_size       32M 32M

所以我可以移动文件,它是我上传的实际图像。

当我尝试在我的演示服务器 (Ubuntu 14.04.5 LTS / Apache/2.4.7 (Ubuntu)) 上执行此操作时,接收到的文件实际上是空的,它的大小为 0

"file" => UploadedFile {#217 ▼
    -test: false
    -originalName: "image.jpg"
    -mimeType: "application/octet-stream"
    -size: 0
    -error: 0
    path: "/tmp"
    filename: "phppFr9Pr"
    basename: "phppFr9Pr"
    pathname: "/tmp/phppFr9Pr"
    extension: ""
    realPath: false
    writable: false
    readable: false
    executable: false
    file: false
    dir: false
    link: false
  }

Apache 配置:

upload_max_filesize 1000M   1000M
post_max_size       1000M   1000M

所以我猜这个问题来自 Apache,但我已经搜索了很长时间,找不到任何提示来解决这个问题。

谢谢。


编辑 1

/tmp目录的权限为:

drwxrwxrwt 13 root root 4096 Nov 15 14:19

如果我尝试使用 Postman 发布图片,/tmp 目录创建良好:

"file" => UploadedFile {#217
    -test: false
    -originalName: "image.jpg"
    -mimeType: "image/jpeg"
    -size: 8112955
    -error: 0
    path: "/tmp"
    filename: "php2LIEcm"
    basename: "php2LIEcm"
    pathname: "/tmp/php2LIEcm"
    extension: ""
    realPath: false
    writable: false
    readable: false
    executable: false
    file: false
    dir: false
    link: false
  }

也就是说apache和php有权限写入这个/tmp目录。

【问题讨论】:

  • 你能告诉我们文件夹的文件权限吗?
  • 嗨@Ronald,我已经编辑了我的问题,Apache 和 PHP 实际上可以在/tmp 中写入文件
  • 你确定吗?为什么用户和用户组仍然是“root root”?
  • 是的,我可以使用 Postman 上传文件,临时文件已保存在 /tmp 并使用我的 php 脚本将文件从 /tmp 复制到 /tmp 但带有新名称,所以如果我的php脚本可以在目录中写入文件,那一定没问题。
  • @Ronald,我尝试将所有者和组更改为drwxrwxrwt 13 www-data www-data 4096 Nov 15 16:43 tmp/,但我遇到了同样的问题。

标签: php apache laravel xamarin multipartform-data


【解决方案1】:

区别在于/tmp的权限。执行您的脚本的用户(如 Apache 或 php)应具有从 write/tmpread 的权限。

【讨论】:

  • 嗨,我已经编辑了我的问题,Apache和PHP实际上可以在/tmp中写入文件
猜你喜欢
  • 2012-07-28
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2011-11-21
相关资源
最近更新 更多