【问题标题】:Adding Metadata to Html5 file upload将元数据添加到 Html5 文件上传
【发布时间】:2016-12-25 03:32:49
【问题描述】:

是否可以在上传 html 5 图片之前添加元数据信息?

澄清:html 5张图片上传(如拖放缩略图方式或单输入文件)sample HTML 5 Upload/drag_drop

假设用户上传了 10 张图片,他将为每张图片填写一些描述它的文本信息,然后这些信息将保存在服务器上。 因此对于每个缩略图用户可以在文本框中添加“标题”、“位置”、“描述”。

下面的示例允许上传单个图像和预览缩略图,我想要实现的是与此缩略图交互并将一些文本连同它一起提交到服务器。

澄清2:这个问题与图片EXIF无关,
我在询问用户可以添加到图片中的一般元数据信息,例如“我在婚礼前拍了这张照片”,或“这张我老家的照片”或喜欢标签“红色”

document.getElementById("files").onchange = function () {
    var reader = new FileReader();

    reader.onload = function (e) {
        // get loaded data and render thumbnail.
        document.getElementById("image").src = e.target.result;
    };

    // read the image file as a data URL.
    reader.readAsDataURL(this.files[0]);
};
<input type="file" id="files" />
<img  width="100" height="140" id="image" />

【问题讨论】:

  • 把你想要的都放在FormData对象中。
  • 我可以为每个单独的图像使用 FormData 吗?你能举个例子吗?我会接受

标签: javascript html


【解决方案1】:

也许这就是你需要的。 正如 charlietfl 在 cmets 中已经说过的,您可以使用 FormData 这是一个例子:

First try with multiple inputs

在这里你可以看到它是如何保存的:

   {
  "args": {}, 
  "data": "", 
  "files": {
    "input1": "yourimg1", 
    "input2": "yourimg2"
  }, 
  "form": {
    "input1": [
      "house", 
      "london"
    ], 
    "input2": [
      "bridge", 
      "berlin"
    ]
  }, 
  "headers": {
    ....
}

现在您的文件和描述与输入字段的名称相关联。重要的是所有属于的输入字段都具有相同的名称。

所以input1中的文件属于input1数组中的描述,input2中的文件属于input2数组中的描述,以此类推。

您可以找到here 的一些很好的解释,如果您愿意,可以使用this 站点来测试代码和输出。

您可以从这里获取代码。在js函数末尾添加

console.log(request.response);

并将网址更改为http://httpbin.org/post。

或者只是玩一下。

编辑:

如果你想要多个文件,你可以这样做:

var testForm = document.getElementById('test-form');
var div = document.getElementById('output');
var data;
  testForm.onsubmit = function(event) {
    event.preventDefault();
    var request = new XMLHttpRequest();
    request.open('POST', 'http://your.url/post', /* async = */ false);

    var formData = new FormData(document.getElementById('test-form'));

    request.send(formData);
  }
  
  function handleFileSelect(evt) {
    var files = evt.target.files;

    // Loop through the FileList and render image files as thumbnails.
    for (var i = 0, f; f = files[i]; i++) {

      // Only process image files.
      if (!f.type.match('image.*')) {
        continue;
      }

      var reader = new FileReader();

      // Closure to capture the file information.
      reader.onload = (function(theFile) {
        return function(e) {
          // Render thumbnail.
          var span = document.createElement('span');
          span.innerHTML = 
          [
            '<img src="', 
            e.target.result,
            '" title="',
            escape(theFile.name), 
            '"/><div class="desc"><div>Location:<input name="',
            escape(theFile.name),
            '"> </div><br><div>Title:<input name="',
            escape(theFile.name),
            '"></div><br><div>Description:<input name="',
            escape(theFile.name),
            '"></div><br></div>'
          ].join('');
          
          document.getElementById('list').insertBefore(span, null);
        };
      })(f);

      // Read in the image file as a data URL.
      reader.readAsDataURL(f);
    }
  }
  
//makes description visible  	 	
$(document).on("click","img",function(){
        $(this).next().css("display", "block");
    });


  document.getElementById('files').addEventListener('change', handleFileSelect, false);
.desc{
  display:none;
}
img{
  height: 75px;
  border: 1px solid #000;
  margin: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id='test-form'>
  <input type="file" id="files" name='input1' multiple/><br>
  <output id="list"></output><br>
  <input type='submit'>
</form>

那么这就是你的输出:

{
  "args": {}, 
  "data": "", 
  "files": {
    "input1": "all_your_images"
  }, 
  "form": {
    "favicon.png": [
      "1a", 
      "1b", 
      "1c"
    ], 
    "loginBackground.jpg": [
      "2a", 
      "2b", 
      "2c"
    ]
  }, 
  "headers": {
   ....}

缺点是所有图片都是一起上传的。 正如您现在所看到的,每个描述都保存在一个数组中,并带有其所属图像的名称。

<div>Location:<input name="', escape(theFile.name),'"> </div>

这为 inputname 提供了所属图像的名称。

因此,如果您想以数组或类似方式保护服务器上的图像和描述,则必须使用 PHP 获取上传图像的名称。

$filename = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME);

(见HERE)

我知道您希望通过拖放来实现它,但是这样的代码会很长。 如果您仍然想这样做,我可以推荐您this site。 您只需将功能添加到我发布的代码中即可。

如果您想直接保护图像中的信息,那么我只能指向answer of tnt-rox。那么您应该访问他的链接并阅读有关 exif 的更多信息。

【讨论】:

  • 谢谢您,请参阅我的代码 sn-p,解决方案需要单个文件上传或 html 5 拖放而不是多个文件输入。
  • @user648026 啊,好吧,所以所有的图像文件都同时上传,并且每个图像用户都有三个文本框?并且用户必须添加描述所属的图像名称?还是他必须记住他将图像放在文件上传中的顺序,然后必须以相同的顺序输入描述?或者他怎么知道他当前正在写哪个图像描述?
  • 这个 HTML 5 拖放有缩略图,当点击缩略图时 UI 应该改变以允许添加文本
  • @user648026 查看我的编辑,它不是通过拖放操作,但通过链接实现应该不难。
【解决方案2】:

我不确定您为什么对这个问题投了反对票。这可能与您的措辞有关。我假设您的意思是 Exif 数据而不是元数据。见https://en.wikipedia.org/wiki/Exif

要在 JavaScript 中修改图片的 Exif 数据,您可以使用 hMatoba 的piexifjs,它允许您在上传到服务器之前修改图片的 Exif 元数据。

希望这会有所帮助)

【讨论】:

  • 要回答“为什么投票”,我觉得这个问题太模糊了。在我阅读您的答案之前,我什至没有考虑过这个问题与 EXIF 相关 - 并不是说​​它不是,只是这一点完全不清楚这一事实使它成为一个糟糕的问题。
  • 不,我不是说Exif,我正在上传图片,每张图片我都想上传文字描述(用户将为每个img输入),该怎么做?
  • 那个是 Exif,不是吗?
  • @DanielShillcock 这就是我理解问题的方式)
  • 不,Exif 不是用户手动数据,它的元数据来自相机,我说的是上传时的用户数据,用户想在图像中添加描述,或者标记它们。
【解决方案3】:

我认为问题在于您放置了静态图像元素。所以我编写了一个代码,为每个文件生成图像和标题文本框,这就是我所达到的代码 sn-p

var count = 0;
document.getElementById("files").onchange = function (e) {
  var image = document.createElement("img");
  
  image.width = "100";
  for(var i=0;i<this.files.length;i++){
    var reader = new FileReader();
    reader.onload = function (e) {
      //Add the image
      var im = image.cloneNode();
      im.id= "image"+count;
      im.src = e.target.result;
      document.body.appendChild(im);
      //Add the title for example
      var title = document.createElement("input");
      title.id = "title-img"+count;
      title.placeholder= "Enter the title of image "+count;
      document.body.appendChild(title);
      count++;
    };
    reader.readAsDataURL(this.files[i]);
  }
};
<html>
	<head>
	</head>
	<body>
        <input type="file" multiple id="files" />
	</body>

</html>

希望对你有帮助。

【讨论】:

    【解决方案4】:

    为此,只需使用表单从用户那里获取详细信息。代码示例如下,

    HTML 代码,

    <Form action="imageSave.php" method="Post">
     <table>
      <tr>
        <td> Title </td>
        <td> <input type="text" name="imageTitle" > </td> 
      <tr>
      <tr>
        <td> Location</td>
        <td> <input type="text" name="imageLocation" > </td> 
      <tr>
      <tr>
        <td> Description</td>
        <td> <textarea name="description" > </textarea> </td> 
      <tr>
      <tr>
        <td> Image </td>
        <td> <input type="file" name="files" > </td> 
      <tr>
     </table>
    </Form>
    

    在您的数据库中添加这些列,

    • 表名:tblImages
    • 第 1 列:id [int]
    • 第 2 列:imageTitle [varchar(255)]
    • 第 3 列:imageLocation [varchar(255)]
    • 第 4 列:描述 [文本]
    • 第 5 列:图像名称 [varchar(255)]

    然后使用这个 PHP 文件 (imageSave.php)

    $imageTitle=$_POST['imageTitle'];
    $imageLocation=$_POST['imageLocation'];
    $description=$_POST['description'];
    $imageName=$_FILES['files']['name'];
    
    if ($_FILES["files"]["error"] == 0)
    {
      $remove_these = array(' ','`','"','\'','\\','/','(',')');
      $newname = str_replace($remove_these,'',$_FILES['files']['name']);
      //Make the filename unique
      $newname = time().".".$extension;
      //Save the uploaded the file to another location
      $upload_path = "/images/$newname";
      //echo $upload_path;
      move_uploaded_file($_FILES['files']['tmp_name'], $upload_path);
    
      // Query and Code to Update the Database
    }
    

    【讨论】:

    • 此解决方案将按表单发送信息,而不是按缩略图单独发送信息对吗?
    • 是的,大多数情况下你不能用图片附加信息
    • 这没有回答问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2012-04-28
    相关资源
    最近更新 更多