2016-05-23 112 views
1

我计划开发一个图像上传API,它需要将图像上传到服务器位置作为我的项目的一部分。 (用法是使用Android应用程序上传用户图片和头像)使用博客将图像上传到服务器PHP

API应与Imgur API类似,我们可以在其中使用发布请求将二进制图像上传到服务器。

我通过多个问题搜索,所有得到的是使用多部分请求,这需要html表单提交。由于我的目标是创建一个API,HTML表单提交将是不可能的。

无论如何,我提交了一个使用html表单上传图片的示例代码。有人可以展示我如何修改脚本以符合我的要求?

<html> 
      <body> 

<form action="photo.php" method="post" 
enctype="multipart/form-data"> 
<label for="file">Filename:</label> 
<input type="file" name="file" id="file"><br> 
<input type="submit" name="submit" value="Submit"> 
</form> 
       </body> 
       </html> 

PHP代码

<?php 
$allow = array("jpg", "jpeg", "gif", "png"); 

$todir = 'uploads/'; 

if (!!$_FILES['file']['tmp_name']) // is the file uploaded yet? 
{ 
    $info = explode('.', strtolower($_FILES['file']['name'])); // whats the extension of the file 

    if (in_array(end($info), $allow)) // is this file allowed 
    { 
     if (move_uploaded_file($_FILES['file']['tmp_name'], $todir . basename($_FILES['file']['name']))) 
     { 
      // the file has been moved correctly 
     } 
    } 
    else 
    { 
     // error this file ext is not allowed 
    } 
} 
?> 
+0

它有效的语法'!! $ _ FILES ['file'] ['tmp_name']'??双'!!' – Saty

+0

哎呀。纠正它。感谢您的信息。 –

+0

等待'!!'我认为实际上更有意义,现在你似乎只在没有文件上传时才运行验证码。双重exclam'!!'只是简单地将一个值转换为布尔值,因为它仅仅意味着虚假行为。因此,它将采用一个变量并评估它的布尔值,然后应用逻辑“NOT”,再次执行该操作只会将一个变量转换为布尔值,但由于它处于if条件,因此无论如何,所以我不在这里看点。但是,编辑后,它实际上看起来是错误的。 – apriede

回答

0

需要HTML表单提交

这是不对的多部分请求。它需要格式正确的请求(标​​题和正文),句点。事实上,服务器无法知道用什么软件来生成请求 - 或者如果您只是在控制台中键入字节;-)

+0

这很有趣。不过,我只想表达一下,我不能在我的情况下使用HTML表单提交。 –

+0

我的回答是想表达你不需要。我很确定Android SDK提供了适当的库来生成'multipart/form-data'消息,而无需使用浏览器作为代理。无论如何,如果你的问题实际上与此无关,我建议你编辑它,我会很高兴删除我的答案。 –

1

关于您的服务器端代码的一些评论顺序:

  • 正如你可以在阅读Handling file uploads,正确的方法来验证上传比较['error']子项与UPLOAD_ERR_OKcodes explained here)。不要使用['tmp_name']

  • 不要让最终用户选择服务器上的实际文件名。你最好自己生成一个唯一的名称,并保持显示名称在其他地方(如数据库)

  • 推荐的方法来确定文件扩展名是pathinfo:由用户提供

    pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION) 
    
  • 文件扩展名不是确定文件类型的可靠方法。对于图片,经常使用getimagesize功能。