PHP API для загрузки и сохранения изображений на сервере без формы с использованием скрипта Python

Я пытаюсь создать простой php API, который будет работать на удаленном сервере и сохранять изображения (которые отправляются в API из скрипта Python) в определенный каталог на сервере.

Я наткнулся на этот код здесь и изменил его для своего варианта использования, но, похоже, он не работает. Что мне здесь не хватает? Я хочу переместить файл в /var/sftp/uploads. Где я должен разместить этот файл php и как мне получить к нему доступ? Какой пользователь ОС должен владеть этим файлом в Ubuntu Linux и должен ли он иметь права на запись в /var/sftp/uploads?

<?php
$allowedExts = array("gif", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/png"))
&& in_array($extension, $allowedExts)) {

  if ($_FILES["file"]["error"] > 0) {

    echo "Error: " . $_FILES["file"]["error"] . "<br>";

  } else {

    //Move the file to the uploads folder
    move_uploaded_file($_FILES["file"]["tmp_name"], "/var/sftp/uploads/" . $_FILES["file"]["name"]);

  }
} else {
  //File type was invalid, so throw up a red flag!
  echo "Invalid File Type";
}
?>
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
734
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

При нормальных обстоятельствах httpd не сможет получить доступ к папке типа «/var/sftp/uploads/».

Следовательно, создайте подпапку, известную как «uploadfile» (эта подпапка должна находиться прямо под папкой вашего файла php) и разрешите запись.

После этого измените строку

 move_uploaded_file($_FILES["file"]["tmp_name"], "/var/sftp/uploads/" . $_FILES["file"]["name"]);

к

 move_uploaded_file($_FILES["file"]["tmp_name"], "./uploadfile/" . $_FILES["file"]["name"]);

После того, как вы загрузили файл, проверьте, виден ли файл в этой папке «uploadfile».

Привет Кен. Я попробовал ваш код, но файл не передается. Я использую библиотеку запросов Python для передачи файла. Ниже приведен мой код: import request file_name=input("Введите имя файла изображения для передачи: ") с open(file_name, 'rb') as f: r = request.post('example.com/file_upload.php', files = {file_name: f}) print("Ответ:",r)

Shoumik Das 16.12.2020 16:43

вместо передачи python вы можете использовать передачу файлов php?

Ken Lee 17.12.2020 05:47

Я разрабатываю настольное приложение Python. Поэтому я хотел бы использовать Python. В коде Python я вызываю конечную точку PHP для передачи файлов. У меня есть обновление: PHP API теперь работает нормально, но в случае отсутствия файла он возвращает ошибку веб-сервера. Если я перезапущу сервер, а затем повторю попытку, передача файлов будет работать нормально. Это происходит из-за какого-то кеша php?

Shoumik Das 17.12.2020 16:10
Ответ принят как подходящий

Я использовал этот код, и он сработал. Я также убедился, что папка /var/sftp/uploads принадлежит www-data, чтобы он мог записывать туда файлы.

<?php
$target_dir = "/var/sftp/uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// Check if image file is a actual image or fake image
if (isset($_POST["submit"])) {
  $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
  if ($check !== false) {
    echo "File is an image - " . $check["mime"] . ".";
    $uploadOk = 1;
  } else {
    echo "File is not an image.";
    $uploadOk = 0;
  }
}

// Check if file already exists
if (file_exists($target_file)) {
  echo "Sorry, file already exists.";
  $uploadOk = 0;
}

// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
  echo "Sorry, your file is too large.";
  $uploadOk = 0;
}

// Allow certain file formats
if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
  echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
  $uploadOk = 0;
}

// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
  echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
  if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
  } else {
    echo "Sorry, there was an error uploading your file.";
  }
}
?>

Другие вопросы по теме