图片上传/接收API

2024-02-21

我想在我的网站上提供一个简单的 API,允许人们向其上传图像(并接收 URL 来访问它)。

但我有几个问题:

  • 如果用户必须以二进制代码发送图像会更好,还是如果用户必须以 idk ASCII 等方式发送图像会更好?常规方式是什么? (我这么问是因为我可以想象某些语言只具有将文件读取为文本文件的功能。)

  • 我将图像存储在服务器上的什么位置以及如何存储?我可以将它们放入 MySQL 数据库吗?这样效果会好吗?或者我应该将它们全部放在一个文件夹中?

  • 用户应该如何指定文件类型?在标题中还是在正文中?

  • 我如何接收数据并将其保存为文件?

我在其他地方找到了这段代码:

<?php

/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");

/* Open a file for writing */
$fp = fopen("myputfile.ext", "w");

/* Read the data 1 KB at a time
   and write to the file */
while ($data = fread($putdata, 1024))
  fwrite($fp, $data);

/* Close the streams */
fclose($fp);
fclose($putdata);

?>

这适用于图像等二进制文件吗?
“一次读取 1 KB 数据”是个好主意吗?


最简单的方法是将文件存储在服务器上的文件夹中。然后将文件的 URL 存储在 MySQL 数据库中,如果用户不知道文件位置,则拉取文件 URL(假设您有登录功能)。

例如:

(UPLOAD.PHP 或您用来将文件上传到服务器的脚本)

<?php
    $connect_to_db = mysqli_connect('localhost', 'user', 'pass', 'db');

    $user = $_POST['user'];

    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);

    if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
    && in_array($extension, $allowedExts)) {

      if ($_FILES["file"]["error"] > 0) {

        echo "Error: " . $_FILES["file"]["error"] . "<br>";

      } else {

        //Move the file to the uploads folder
        move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/" . $_FILES["file"]["name"]);

        //Get the File Location
        $filelocation = 'http://yourdomain.com/uploads/'.$_FILES["file"]["name"];

        //Get the File Size
        $size = ($_FILES["file"]["size"]/1024).' kB';

        //Save to your Database
        mysqli_query($connect_to_db, "INSERT INTO images (user, filelocation, size) VALUES ('$user', '$filelocation', '$size')");

        //Redirect to the confirmation page, and include the file location in the URL
        header('Location: confirm.php?location='.$filelocation);
      }
    } else {
      //File type was invalid, so throw up a red flag!
      echo "Invalid File Type";
    }
?>

现在您可以做的是在页面中创建一个表格,并让它根据登录者列出所有上传的文件(再次假设您使用此功能)。这将使人们知道必须保留他们上传的所有文件的日志。

以下示例是如果您使用 Ajax 发布数据,并且它返回 JSON 格式的数据,因此您可以让用户不必重新加载页面。

<?php
    $connect_to_db = mysqli_connect('localhost', 'user', 'pass', 'db');

    $user = $_POST['user'];

    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);

    if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
    && in_array($extension, $allowedExts)) {

      if ($_FILES["file"]["error"] > 0) {

        echo json_encode(array('status' => 'error', 'msg' => 'File could not be uploaded.'));

      } else {

        //Move the file to the uploads folder
        move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/" . $_FILES["file"]["name"]);

        //Get the File Location
        $filelocation = 'http://yourdomain.com/uploads/'.$_FILES["file"]["name"];

        //Get the File Size
        $size = ($_FILES["file"]["size"]/1024).' kB';

        //Save to your Database
        mysqli_query($connect_to_db, "INSERT INTO images (user, filelocation, size) VALUES ('$user', '$filelocation', '$size')");

        //Return the data in JSON format
        echo json_encode(array('status' => 'success', 'data' => array('filelocation' => $filelocation, 'size' => $size)));
      }
    } else {
      //File type was invalid, so throw up a red flag!
      echo json_encode(array('status' => 'error', 'msg' => 'Invalid File Format'));
    }
?>

如果您还想限制文件大小,可以添加一行简单的代码来检查文件大小,如果文件太大,则不会让它通过:

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000) //Must be smaller than 20KB
&& in_array($extension, $allowedExts)) {

如果您需要更多帮助,请随时告诉我。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图片上传/接收API 的相关文章

随机推荐

  • 解组非根元素时的 JAXB 模式验证

    当您使用 JAXB 解组整个 XML 时 您可以设置 XML 模式以在解析期间启用验证 javax xml validation Schema schema jaxbUnmarshaller JAXBContext newInstance
  • 逐行读取并存储在结构体数组中

    我正在尝试从文本文件中逐行读取行并将其存储在数组中 txt 文件中有一些问题将询问玩家 下面是一些问题 1 N r kom potatisen till Europa A 1300 talet B 1500 talet C 900 tale
  • 禁用 Maven 内部版本号插件

    目前我们正在开发一个大型 Maven 项目 该项目有大约 100 个模块 其中一些还有子模块 一些模块使用 Maven Build Number 插件 该项目是在 Subversion 下托管的 最近我们的开发团队开始在本地使用 git 克
  • 使用 firebase 作业调度程序安排重复作业

    我试图每 10 分钟将 Android 设备的位置发布到服务器一次 我正在使用 firebase 作业调度程序来执行此操作 FirebaseJobDispatcher dispatcher new FirebaseJobDispatcher
  • 仅针对单个模式生成流畅的代码

    有没有办法让 Slick 的代码生成仅为单个模式生成代码 你说 公开 我有一些扩展可以创建大量的表 例如 postgis pg jobman 从而使 slick 生成的代码变得巨大 将此代码与适当的值和模式名称一起使用 object Cod
  • 如何在eclipse中缩进jsp页面

    刚开始使用 jsp 我的页面看起来很糟糕 请建议一种缩进的方法 thanks 首先确保您安装了 Web Tools 如果没有 请检查此链接 http download eclipse org webtools updates http do
  • 提升 Asio 单线程性能

    我正在实现需要维护大量 100K 或更多 长期连接的自定义服务器 服务器只是在套接字之间传递消息 并且不进行任何认真的数据处理 消息很小 但每秒都会接收 发送许多消息 减少延迟是目标之一 我意识到使用多核不会提高性能 因此我决定通过调用在单
  • Python 中的自定义错误消息

    所以我正在练习一些单元测试 我有一个关于错误消息的问题 我正在尝试创建一条自定义错误消息 该消息将在测试失败时显示 这是一个基本的 Hello World 程序 测试运行良好 一切正常 但这是我收到的错误消息 F FAIL test Str
  • ADO.NET 数据表约束如何影响性能?

    DataTable 上的约束 例如主键和唯一约束 是否可以像在 SQL Server 中一样使 Select 更高效 或者他们的唯一目的是对数据执行规则 myDT Constraints Add PK myDT Columns Unique
  • 即使链接具有定义的库后,也会出现“未定义的函数引用”问题

    我正在尝试使用 o so a 文件创建可执行文件 这是我的构建命令 pkgs gcc v4 8 3 bin gcc L usr X11R6 lib O2 DUSE FLEX Wall Wno char subscripts fPIC DLI
  • Visual Studio 调试器在内联代码中速度变慢

    自从我从 vs2005 升级到 Visual Studio 2008 以来 我在调试大型项目时发现了一个非常烦人的行为 如果我尝试单步执行内联代码 调试器似乎会锁定数十秒 每次我进入这样的函数时 都会出现类似的停顿 有没有人经历过这种情况并
  • Groovy 命名参数会导致参数分配发生切换——有什么办法可以解决这个问题吗?

    Groovy 会将所有命名参数收集到一个映射中 并将其作为第一个参数传递到方法中 这看起来很简洁 但是在尝试让它工作之后 它似乎真的无法使用 所以问题是这样的方法 def method paramMap specificVar1 7 spe
  • 在两个闪亮的应用程序之间切换

    所以我有两个独立的onefileshinyApps 带有 UI 和服务器 位于一个函数内 现在我需要做的是在第一个应用程序中调用第二个应用程序 这是一个简单的示例 功能被简化以显示我想要实现的功能 appOne lt function ap
  • 在汇编中仅设置零标志,不影响其他标志

    我需要在程序集中设置零标志 但它不应该更改任何其他标志 所以我正在考虑做pushf 将其弹出到eax 但我不知道如何为标志reg赋予新值 我能想到的 pushf pop eax or eax 000 1 00 set the locatio
  • 使用 nvm 使 node.js 文件可执行的最佳方法

    我在用着nvm https github com creationix nvm管理我的节点版本 我的node js可执行文件曾经像这样被sha bang ed usr local bin node但现在看来我必须做类似的事情 Users
  • 将字符串拆分为数组[重复]

    这个问题在这里已经有答案了 在 JS 中 如果您想将用户条目拆分到数组中 最好的方法是什么 例如 entry prompt Enter your name for i 0 i
  • 用 Latex 代码替换字符串向量中的重音符号

    Define df lt data frame name c M xico Michoac n dat c 1 2 s t gt df name dat 1 M xico 1 2 Michoac n 2 当我将此表打印到 tex文件使用xt
  • 为什么我们必须在 onClick 方法中添加“View”作为参数以及它的作用是什么?

    我正在 Android Studio 中的按钮上设置事件监听器 用于更改按钮内的文本TextView到了这一点 我们定义了OnClick方法 在其参数列表中要求View目的 谁能解释一下它的作用吗 我无法理解对象在哪里View类将会习惯 它
  • AppCompatActivity 的 TextView 颜色始终为白色

    a 的文字颜色TextView在 Marshmallow 之前的设备上始终为白色 即使我在 XML 中使用黄色或黑色 除了棉花糖之外 它始终是白色的 在运行时 它将在所有设备上正常工作 以前 当我使用 Eclipse 时 一切正常 但在 A
  • 图片上传/接收API

    我想在我的网站上提供一个简单的 API 允许人们向其上传图像 并接收 URL 来访问它 但我有几个问题 如果用户必须以二进制代码发送图像会更好 还是如果用户必须以 idk ASCII 等方式发送图像会更好 常规方式是什么 我这么问是因为我可