PHP在我上传的文件中添加2个额外字节

PHP在我上传的文件中添加2个额外字节,php,upload,Php,Upload,我有一个通过PHP上传文件的过程,但最终得到的文件比源文件大2字节。我不确定这两个字节是从哪里来的。(实际的过程是分块上传,我将一个文件切片并上传切片,每个切片的长度都比开始时长2字节,但我用一个小文件进行了测试,它也比源文件大2字节) 我正在附加我的PHP。。。这是PHP的正常功能吗?我正在想象某种类型的空终止符或其他东西(每个文件的结尾似乎都有一个\n,而最初不在那里)。我是否需要将文件读入缓冲区并在重新组装原始文件之前去掉最后两个字节?我不得不想象我做错了什么,但我不知道那会是什么 如果我

我有一个通过PHP上传文件的过程,但最终得到的文件比源文件大2字节。我不确定这两个字节是从哪里来的。(实际的过程是分块上传,我将一个文件切片并上传切片,每个切片的长度都比开始时长2字节,但我用一个小文件进行了测试,它也比源文件大2字节)

我正在附加我的PHP。。。这是PHP的正常功能吗?我正在想象某种类型的空终止符或其他东西(每个文件的结尾似乎都有一个\n,而最初不在那里)。我是否需要将文件读入缓冲区并在重新组装原始文件之前去掉最后两个字节?我不得不想象我做错了什么,但我不知道那会是什么

如果我确实需要手动去除最后两个字节,那么正确的方法是什么(它是一个二进制文件),然后将其余的附加到我正在重建的整个文件中


编辑


当PHP将每个上传的文件保存到服务器时,每个文件的末尾都会添加一个0D0A单词。所以我想问题是如何防止这种情况发生

<?PHP
$target_path = $_REQUEST[ 'path' ];
$originalFileName = $_REQUEST['original_file_name'];
$target_path = $target_path . basename( $_FILES[ 'Filedata' ][ 'name' ] );

if ( move_uploaded_file( $_FILES[ 'Filedata' ][ 'tmp_name' ], $target_path ) )
{

        $newFilePath = $originalFileName; //this is the overall file being re-assembled
        $fh = fopen($newFilePath, 'ab') or die("can't open file");

        $nextSlice = file_get_contents($target_path); //this is the slice that's 2 bytes too big each time

        fputs($fh, $nextSlice);
        fclose($fh);

//      unlink($target_path); //normally I'd delete the slice at this point, but I'm hanging on to it while I figure out where the heck the 2 extra bytes are coming from.

        fclose($fh);

        echo "SUCCESS";

}
else
{
     echo "FAIL:There was an error uploading the file, please try again!";
}
?>

文件是二进制文件吗?我认为
file\u get\u contents
会导致问题,因为它将其视为字符串。也许你应该试试看?

解决方案是:

fwrite($fh,$GLOBALS[“HTTP_RAW_POST_DATA”])


当我使用问题中所述的方法时,文件的末尾会有额外的0D0A,但上述提取数据的方法会使其完整无缺地到达,并且长度完全正确。我的请求可能有误。

听起来像是BOM(字节顺序标记)。文件的编码是什么?如果将
fputs
替换为
fwrite
问题是否消失?(我知道它们应该是同义词,但至少在C
fputs
中,fputs向输出添加了一个换行符;因此PHP函数可能有一个错误,使它添加了换行符……
fputs($fh,$nextSlice,count($nextSlice)-2)
?大小何时更改(\r\n添加)?move_上传_file()后是否有所不同?或者直到运行file_get_contents()?或者,当您将其写出来时,会添加\r\n?我的预感是,浏览器正在添加它,您必须在收到后将其删除。move_上传的文件添加了2个字节(我忘了先检查一下……很好的捕获!),这听起来很有希望,但没有骰子。。。同样的结果。我应该注意,查看hex edit,原始文件的最后一个字是0D0A,我看到最后两个字(加上一个额外的字)是该字的重复(0D0A 0D0A)。我现在测试一下,看看这是否是巧合(可能性很小)。CrLF。。。这是什么意思?我不知道该怎么办。。。我不想让它在那里。。。这不是我要发送的内容的一部分:)@Dredel博士,回车,换行,又名\r\n\n@Dr.Dredel:这意味着您正在Windows(ugh)上运行,并且没有包含文件读取的
b
标志,因此使C文件api将换行符转换为Windows换行符。@Dr.Dredel:Mac以前有类似的转换方案。检查您的
PHP\u EOL
。否则,这将表明多部分/表单数据请求主体存在问题(例如,客户端未发送内容长度:字段)。