在命令行上通过Curl上传PHP文件

8

我在使用PHP上传文件到服务器时遇到了困难,但是当我使用这个简单的HTML表单时,它似乎可以正常工作:

<html><body>
<form enctype="multipart/form-data" action="uploads.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

PHP是一种后端编程语言:

<?php
$target_path = "uploads/";
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
" has been uploaded";
} else{
echo "There was an error uploading the file, please try again!";
}
?>

有没有可能通过curl命令行或shell脚本使用此技术发送文件?例如:

curl -f "@/path/to/my/file;type=text/html" http://mywebserver.com/uploads.php

这一行代码给了我这样的错误提示:"curl: (22) Failed to connect to ::1: Permission denied",尽管该网站没有密码等限制。我认为这是可能的,但是我语法使用不正确?


你还应该通过 -X 'POST' 设置方法为 POST。 - fardjad
请非常小心使用此脚本,因为它可以上传任何类型的文件并且是一个安全漏洞(脚本可以直接上传到您的服务器,然后使用浏览器执行)... 因此需要额外编写保护代码! - jnhghy - Alexandru Jantea
1个回答

12

我认为你希望参数是大写的 F(用于表单)。小写的 f 是用于失败,并返回错误代码 22。说真的,这在手册中有说明!

-f,--fail

(HTTP)在服务器错误时静默失败(完全没有输出)。这主要是为了更好地使脚本等能够更好地处理失败的尝试。通常情况下,当 HTTP 服务器未能传递文档时,它会返回一个说明文档未能正常传递的 HTML 文档(通常还会描述原因和更多信息)。此标志将防止curl输出该文档并返回错误22。

这种方法并不是绝对可靠的,有时候非成功响应代码会通过,特别是涉及身份验证时 (响应代码为401和407)。

-F,--form

(HTTP)这使得curl模拟填写了一个用户已经按下提交按钮的表单。这将导致curl使用Content-Type multipart/form-data根据RFC 2388 POST数据。这使上传二进制文件等成为可能。要强制“内容”部分为文件,请在文件名前加上@符号。要从文件中获取内容部分,请在文件名前加上符号<。@和<之间的区别在于,@使文件作为文件上传附加在帖子中,而<则创建一个文本字段,并仅从文件获取该文本字段的内容。

此外,您还没有命名您的文件变量。我认为您需要:

curl -F "uploadedfile=@/path/to/my/file" http://mywebserver.com/uploads.php

1
谢谢,尽管它仍然不起作用。(这次PHP返回:“上传文件时出错”。我想今天我注定要失败。) - BSUK
我已经添加了一些关于给文件变量命名的内容。 - Adam Hopkinson
您,先生,真是个天才!非常感谢,非常感激。工作得像梦一样顺畅。 - BSUK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接