将元数据添加到Html5文件上传

问题描述 投票:4回答:4

是否可以在上传之前添加元数据信息和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" />
javascript html5
4个回答
3
投票

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

First try with multiple inputs

在这里你可以看到它的保存方式:

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

现在,您的文件和描述与输入字段的名称相关联。所有beloning输入字段都具有相同的名称非常重要。

所以来自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的信息。


2
投票

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

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

希望这可以帮助 )


1
投票

我认为问题是你把静态图像元素。因此,我为每个文件创建了一个生成图像和标题文本框的代码,这是我所达到的代码片段

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>

我希望它对你有所帮助。


0
投票

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

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>

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

  • TableName:tblImages
  • 第1列:id [int]
  • 第2列:imageTitle [varchar(255)]
  • 第3列:imageLocation [varchar(255)]
  • 第4栏:说明[文字]
  • 第5列:imageName [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
}
© www.soinside.com 2019 - 2024. All rights reserved.