@dramiel007

Почему передается неверный mimetype при отправке файла средствами php?

Доброго времени суток.

Пишу скрипт для загрузки фотографий в ЛК пользователя, фотографии должны загружаться на файловый сервер. Для этого на сайте есть скрипт, который получает файлы из формы и перенаправляет их на api на файловом сервере.

Код (без всего лишнего) такой:
function sendFile($file, $server) {
  $request = curl_init($server);

  $tempFile = $_SERVER['DOCUMENT_ROOT'] . '/temp/' . $file['name'][0]; 
  move_uploaded_file($file['tmp_name'][0], $tempFile); 

  $data = array('files' => '@' . $tempFile);
  curl_setopt($request, CURLOPT_POST, 1);
  curl_setopt($request, CURLOPT_POSTFIELDS, $data);

  curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
  $res = curl_exec($request);

  curl_close($request);

  return $res;
}

sendFile($_FILES['files'], $server);


Данные, которые принимает сервер (тут в формате json)
{
  "files": {
    "name":"tokyo-gorod-zakat.jpg",
    "type":"application\/octet-stream",
    "tmp_name":"\/tmp\/phpeA0GRV",
    "error":0,
    "size":314398
  }
}


Почему файл передается с type application/octet-stream, а не с image/jpeg? И как решить эту проблему?
  • Вопрос задан
  • 325 просмотров
Решения вопроса 2
@santaatnas
Java, Python, Php
Юзайте либо php.net/manual/en/class.curlfile.php, либо явно указывайте в CURLOPT_POSTFIELDS ;type=mimetype
Ответ написан
Комментировать
RomaZveR
@RomaZveR
CEO AlertMoney, PHP/Golang Developer
$data = array('files' => '@' . $tempFile);
  curl_setopt($request, CURLOPT_POSTFIELDS, $data);

Разве не deprecated 100 лет в обед?

Попробуйте так
function sendFile($file, $server) {
  $request = curl_init($server);

  $tempFile = $_SERVER['DOCUMENT_ROOT'] . '/temp/' . $file['name'][0]; 
  move_uploaded_file($file['tmp_name'][0], $tempFile); 
  //http://php.net/manual/en/class.curlfile.php
  $file_data = new CurlFile($tempFile);
  //http://php.net/manual/ru/function.mime-content-type.php
  $file_data->setMimeType(mime_content_type($tempFile));
  curl_setopt($request, CURLOPT_POST, 1);
  curl_setopt($request, CURLOPT_POSTFIELDS, ['files' =>  $file_data]);

  curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
  $res = curl_exec($request);

  curl_close($request);

  return $res;
}

sendFile($_FILES['files'], $server);


Ну и не хватает проверки пары extension=>mime по белым спискам.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@RidgeA
видимо, потому что нужно явно ставить mime-type
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы