【问题标题】:cannot copy .csv file from Windows to Linux server using php无法使用 php 将 .csv 文件从 Windows 复制到 Linux 服务器
【发布时间】:2015-01-26 20:34:35
【问题描述】:

在 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');
}
?>

【问题讨论】:

  • 你得到的输出是什么?
  • 在问题中说明您如何验证 csv 文件是否成功。
  • 当我使用 WinSCP 并签入该目录时没有 .csv 文件 - 而当我将 .txt 文件复制到那里并检查它时。
  • 除了扩展名之外,这些文件的名称是否真的完全一样?

标签: php linux csv copy


【解决方案1】:

不要在 PHP 中使用反斜杠指定路径,尤其是在使用双引号字符串时:

$foo = "This\is\a\path\not\a\string";
echo $foo;

生产

This\is\a\path
ot\a\string

注意\not 中的\n 如何被解释为换行符,而不是以字母n 开头的目录名。 PHP NO 知道什么是路径/目录结构。它只看到字符串。由于双引号字符串包含换行符,因此您会得到一个换行符。

PHP 会自动将字符串中的/ 自动转换为本地操作系统的分隔符。只需使用 / 指定所有路径并让 PHP 处理转换:

$foo = "C:/foo/bar/baz"; 

如果你坚持使用反斜杠,那么在任何地方都正确地转义它们:

$foo = "C:\\foo\\bar\\baz";

防止它们被解释为转义/元字符。

【讨论】:

  • 所以我不应该使用 str_replace?
  • 如果您的路径包含\n,那么\n 将从字符串中消失,因为它会被解析为换行符。现在你的klm\nop 两级目录将是一个不存在的klm[newline]op 目录。
  • 我正在尝试实现您的建议,但是尽管有反斜杠,它如何适用于 .txt 文件?
  • 我已经测试过了,它可以工作(非常感谢)-在我放入内容的条件下,即如果我只是复制并且不使用 file_put_contents 行,它就不起作用.... ?
  • 我发现它实际上不起作用,因为 file_get_contents 不起作用...
猜你喜欢
  • 1970-01-01
  • 2022-12-09
  • 2010-09-16
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多