将图像或类似文件从客户端计算机移动到服务器以进行存储并稍后可能显示的过程。
我正在编写一个 API,我想处理从表单 POST 上传的文件。表单的标记并不太复杂: < 我正在编写一个 API,我想处理从表单上传的文件 POST。表单的标记并不太复杂: <form action="" method="post" enctype="multipart/form-data"> <fieldset> <input type="file" name="image" id="image" /> <input type="submit" name="upload" value="Upload" /> </fieldset> </form> 但是,我很难理解如何处理此服务器端并与 cURL 请求一起发送。 我熟悉使用带有数据数组的 cURL 发送 POST 请求,并且我读过的有关上传文件的资源告诉我在文件名中添加 @ 符号作为前缀。但这些相同的资源有一个硬编码的文件名,例如 $post = array( 'image' => '@/path/to/myfile.jpg', ... ); 这是哪个文件路径?我在哪里可以找到它?是否会类似于 $_FILES['image']['tmp_name'],在这种情况下我的 $post 数组应该如下所示: $post = array( 'image' => '@' . $_FILES['image']['tmp_name'], ... ); 或者我的处理方式是错误的吗?任何建议将不胜感激。 编辑:如果有人能给我一个代码片段,说明我将使用以下代码片段去哪里,那么我将不胜感激。我主要关注的是我将作为 cURL 参数发送的内容,以及如何在接收脚本中使用这些参数的示例(为了论证,我们将其称为 curl_receiver.php)。 我有这个网络表格: <form action="script.php" method="post" enctype="multipart/form-data"> <fieldset> <input type="file" name="image /> <input type="submit" name="upload" value="Upload" /> </fieldset> </form> 这将是script.php: if (isset($_POST['upload'])) { // cURL call would go here // my tmp. file would be $_FILES['image']['tmp_name'], and // the filename would be $_FILES['image']['name'] } 这是一些将文件发送到 ftp 的生产代码(可能对您来说是一个很好的解决方案): // This is the entire file that was uploaded to a temp location. $localFile = $_FILES[$fileKey]['tmp_name']; $fp = fopen($localFile, 'r'); // Connecting to website. $ch = curl_init(); curl_setopt($ch, CURLOPT_USERPWD, "[email protected]:password"); curl_setopt($ch, CURLOPT_URL, 'ftp://@ftp.website.net/audio/' . $strFileName); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_NOPROGRESS, false); curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'CURL_callback'); curl_setopt($ch, CURLOPT_BUFFERSIZE, 128); curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile)); curl_exec ($ch); if (curl_errno($ch)) { $msg = curl_error($ch); } else { $msg = 'File uploaded successfully.'; } curl_close ($ch); $return = array('msg' => $msg); echo json_encode($return); 对于找到这篇文章并使用 PHP5.5+ 的人来说,这可能会有所帮助。 我发现 netcoder 建议的方法不起作用。即这不起作用: $tmpfile = $_FILES['image']['tmp_name']; $filename = basename($_FILES['image']['name']); $data = array( 'uploaded_file' => '@'.$tmpfile.';filename='.$filename, ); $ch = curl_init(); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 我会在 $_POST var 中收到 'uploaded_file' 字段 - 而在 $_FILES var 中什么也没有。 事实证明,对于 php5.5+ 有一个新的 curl_file_create() 函数需要使用。所以上面的内容就变成了: $data = array( 'uploaded_file' => curl_file_create($tmpfile, $_FILES['image']['type'], $filename) ); 由于 @ 格式现已弃用。 这应该有效: $tmpfile = $_FILES['image']['tmp_name']; $filename = basename($_FILES['image']['name']); $data = array( 'uploaded_file' => '@'.$tmpfile.';filename='.$filename, ); $ch = curl_init(); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // set your other cURL options here (url, etc.) curl_exec($ch); 在接收脚本中,您将拥有: print_r($_FILES); /* which would output something like Array ( [uploaded_file] => Array ( [tmp_name] => /tmp/f87453hf [name] => myimage.jpg [error] => 0 [size] => 12345 [type] => image/jpeg ) ) */ 然后,如果你想正确处理文件上传,你可以这样做: if (move_uploaded_file($_FILES['uploaded_file'], '/path/to/destination/file.zip')) { // do stuff } 对于我来说,@符号不起作用,所以我做了一些研究,发现这种方法对我有用,我希望这对你有帮助。 $target_url = "http://server:port/xxxxx.php"; $fname = 'file.txt'; $cfile = new CURLFile(realpath($fname)); $post = array ( 'file' => $cfile ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $target_url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)"); curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data')); curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 100); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $result = curl_exec ($ch); if ($result === FALSE) { echo "Error sending" . $fname . " " . curl_error($ch); curl_close ($ch); }else{ curl_close ($ch); echo "Result: " . $result; } 当我通过 Mercadolibre 的消息系统发送附件时,它对我有用。 答案https://stackoverflow.com/a/35227055/7656744 $target_url = "http://server:port/xxxxx.php"; $fname = 'file.txt'; $cfile = new CURLFile(realpath($fname)); $post = array ( 'file' => $cfile ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $target_url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)"); curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data')); curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 100); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $result = curl_exec ($ch); if ($result === FALSE) { echo "Error sending" . $fname . " " . curl_error($ch); curl_close ($ch); }else{ curl_close ($ch); echo "Result: " . $result; } 过程方法中的cURL文件对象: $file = curl_file_create('full path/filename','extension','filename'); Oop 方法中的 cURL 文件对象: $file = new CURLFile('full path/filename','extension','filename'); $data = array('file' => $file); $curl = curl_init(); //curl_setopt ... curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $response = curl_exec($curl); curl_close($curl); 我们可以通过curl请求上传图像文件,将其转换为base64字符串。因此在post中我们将发送文件字符串,然后将其隐藏在图像中。 function covertImageInBase64() { var imageFile = document.getElementById("imageFile").files; if (imageFile.length > 0) { var imageFileUpload = imageFile[0]; var readFile = new FileReader(); readFile.onload = function(fileLoadedEvent) { var base64image = document.getElementById("image"); base64image.value = fileLoadedEvent.target.result; }; readFile.readAsDataURL(imageFileUpload); } } 然后在curl请求中发送它 if(isset($_POST['image'])){ $curlUrl='localhost/curlfile.php'; $ch = curl_init(); curl_setopt($ch,CURLOPT_URL, $curlUrl); curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS, 'image='.$_POST['image']); $result = curl_exec($ch); curl_close($ch); } 请参阅此处http://technoblogs.co.in/blog/How-to-upload-an-image-by-using-php-curl-request/118 这是我的解决方案,我读了很多帖子,它们真的很有帮助,最后我用 cUrl 和 Php 为小文件构建了代码,我认为它非常有用。 public function postFile() { $file_url = "test.txt"; //here is the file route, in this case is on same directory but you can set URL too like "http://examplewebsite.com/test.txt" $eol = "\r\n"; //default line-break for mime type $BOUNDARY = md5(time()); //random boundaryid, is a separator for each param on my post curl function $BODY=""; //init my curl body $BODY.= '--'.$BOUNDARY. $eol; //start param header $BODY .= 'Content-Disposition: form-data; name="sometext"' . $eol . $eol; // last Content with 2 $eol, in this case is only 1 content. $BODY .= "Some Data" . $eol;//param data in this case is a simple post data and 1 $eol for the end of the data $BODY.= '--'.$BOUNDARY. $eol; // start 2nd param, $BODY.= 'Content-Disposition: form-data; name="somefile"; filename="test.txt"'. $eol ; //first Content data for post file, remember you only put 1 when you are going to add more Contents, and 2 on the last, to close the Content Instance $BODY.= 'Content-Type: application/octet-stream' . $eol; //Same before row $BODY.= 'Content-Transfer-Encoding: base64' . $eol . $eol; // we put the last Content and 2 $eol, $BODY.= chunk_split(base64_encode(file_get_contents($file_url))) . $eol; // we write the Base64 File Content and the $eol to finish the data, $BODY.= '--'.$BOUNDARY .'--' . $eol. $eol; // we close the param and the post width "--" and 2 $eol at the end of our boundary header. $ch = curl_init(); //init curl curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'X_PARAM_TOKEN : 71e2cb8b-42b7-4bf0-b2e8-53fbd2f578f9' //custom header for my api validation you can get it from $_SERVER["HTTP_X_PARAM_TOKEN"] variable ,"Content-Type: multipart/form-data; boundary=".$BOUNDARY) //setting our mime type for make it work on $_FILE variable ); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/1.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'); //setting our user agent curl_setopt($ch, CURLOPT_URL, "api.endpoint.post"); //setting our api post url curl_setopt($ch, CURLOPT_COOKIEJAR, $BOUNDARY.'.txt'); //saving cookies just in case we want curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // call return content curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); navigate the endpoint curl_setopt($ch, CURLOPT_POST, true); //set as post curl_setopt($ch, CURLOPT_POSTFIELDS, $BODY); // set our $BODY $response = curl_exec($ch); // start curl navigation print_r($response); //print response } 有了这个,我们应该在“api.endpoint.post”上发布以下变量 您可以使用此脚本轻松进行测试,并且您应该在最后一行的函数 postFile() 上收到此调试信息 print_r($响应); //打印响应 public function getPostFile() { echo "\n\n_SERVER\n"; echo "<pre>"; print_r($_SERVER['HTTP_X_PARAM_TOKEN']); echo "/<pre>"; echo "_POST\n"; echo "<pre>"; print_r($_POST['sometext']); echo "/<pre>"; echo "_FILES\n"; echo "<pre>"; print_r($_FILEST['somefile']); echo "/<pre>"; } 在这里,它应该工作得很好,可能是更好的解决方案,但这确实有效,并且对于理解边界和多部分/来自数据 mime 如何在 php 和curl 库上工作非常有帮助, 我最诚挚的问候, 我对我的英语表示歉意,但这不是我的母语。
我在我的 swift 项目中使用 Gold Raccoon。我的 swift 代码构建并运行良好,但当我检查 FTP 服务器时,没有文件。 这是我在 viewDidload() 中使用的代码 var ftpRequ...
我的目录中有这样的东西: slider-1.jpg slider-2.png slider-4.gif slider-8.png slider-11.gif 现在有没有办法获取“滑块”图像的最后一个尾随数量? 我需要得到...
我需要从我的iOS设备上传大量照片到服务器。例如,500 张照片。我应该如何正确地做到这一点? 我使用后台会话配置创建了上传任务
如何使用 DJango Rest Framework 上传多个图像?
我可以使用以下代码上传单个图像。如果我选择多个图像,则仅上传所选图像中的最后一个图像。 模型.py 图像类(模型.模型):
我们希望将上传的图像存储在我们网站的 CDN 服务器上。如果 CDN 服务出现故障,我们正在考虑在我们的系统中添加后备功能。所以图像开始上传到服务器硬盘上......
我想在wordpress的常规设置选项卡中添加自定义字段。 这是 WordPress 默认情况下存在的字段。 网站标题 标语 WordPress 地址 URL ...ETC 我想添加一个cu...
UnrecognizedImageError - 图像插入错误 - python-docx
我正在尝试使用 python-docx 将 wmf 文件插入 docx,它会产生以下回溯。 回溯(最近一次调用最后一次): 文件“C:/Users/ADMIN/PycharmProjects/ppt-to-word/ppt_r...
我想使用动态茧形式和 Active Storage 来处理文件,将一些图像保存到模型中。 我有一个农民班级,有很多苹果,农民可以为每个苹果添加多个图像...
如何使用 XMLHttpRequest 通过复制粘贴 javascript 接收 php 图像数据
我尝试制作一种类似于 GMail 使用的图像上传功能。您从桌面复制 (CTRL-C) 图像并将其粘贴 (CTRL-V) 到网站上。 然后通过
我用kotlin编写了上传图片到服务器的代码,即用户通过摄像头拍照,然后当用户点击发送按钮时将图片显示在imageView中,...
我正在遵循这个示例,它工作正常,但是当我尝试上传图像但它没有上传并且显示源文件不存在时。任何人都可以帮助我我的代码中有什么错误吗?谢谢...
nginx 使用 Django Rest Framework 进行 POST 图像请求返回 500
前言 我已经做了很多研究来解决我遇到的类似问题,但仍然没有解决我遇到的这个主要问题。作为最后的手段,就像很多案例一样
我正在创建一个图像上传器,如下所示: 这就是我想要发生的事情: 用户可以上传的图片总数为一张。换句话说,如果用户尝试上传另一个...
我目前正在开发一个iOS项目,请求用户上传图像到服务器。 目前,我的 Objective-C 类中有以下代码: NSMutableURLRequest *请求 = [[
我正在开发一个 Google App Engine 项目。 我的应用程序正在运行并且在本地看起来正确,但是当我尝试在图像目录中上传图像时,它们不会显示在 appspot 上。 作为一个点燃...
我正在制作一个Spring boot应用程序,其功能之一是动态上传图像,上传图像后,用户被重定向到他的个人资料页面,并且图像显示为专业版...
Cakephp 3 图片通过 API 上传到 Cloudinary
我正要将图像上传到 cloudinary - 图像 CDN 看起来 cloudinary.com,它支持所有语言和框架,包括 Cakephp 3,但对于 cakephp 3,我们没有包含在他们的步骤中......
我已经创建了图像上传器,但是无法正常工作。我不明白我要去哪里错了。下面给出了我的图像上传器的JSFIDDLE:JSFIDDLE我面临的问题是...
如何使用斩波器库将图像上传到服务器?我尝试在Google上进行搜索,但无法成功进行搜索。我试过的是创建静态斩波器客户端的函数句柄...