В php я могу скопировать файл .txt из расположения в моей ОС Windows на сервер Ubuntu, но по какой-то причине я не могу скопировать файл .csv. Возможно, это как-то связано с Apparmor?
Вот мой код, который работает на 100% с .txt. Однако, если я попытаюсь с файлом .csv, он не будет работать.
<?php
$fileName='Test.txt';
$location="C:\Users\...my location...\Local Store";
$Thispath = str_replace('\\', '/',$location).'/';
$ThisFile = $Thispath.$fileName;
$dir = $_SERVER['DOCUMENT_ROOT'].'/services/csv/';
copy($ThisFile, $dir.$fileName);
if ( !file_exists($dir) ) {
echo 'no file';
}
else{
echo 'file exists';
file_put_contents ($dir.'/hallo.txt', 'Goodbye File');
}
?>
Не используйте обратную косую черту для указания путей в PHP, ОСОБЕННО при использовании строк в двойных кавычках:
$foo = "This\is\a\path\not\a\string";
echo $foo;
производит
This\is\a\path
ot\a\string
Обратите внимание, как \n
в \not
был интерпретирован как символ перевода строки, а не имя каталога, начинающееся с буквы n
, PHP имеет НЕТ Идея, что такое конструкция пути / каталога. Он просто видит строки. И так как эта строка в двойных кавычках содержит символ новой строки, то вы получаете символ новой строки.
PHP будет автоматически конвертировать /
в строке «используется как путь» к символам разделителя локальной операционной системы для вас автоматически. Просто укажите ВСЕ ваши пути с /
и пусть PHP обработает преобразование:
$foo = "C:/foo/bar/baz";
Если вы НАСТАИВАЕТЕ использовать обратную косую черту, то избегайте их везде:
$foo = "C:\\foo\\bar\\baz";
чтобы их нельзя было интерпретировать как побеги / метачары.
Других решений пока нет …