代码之家  ›  专栏  ›  技术社区  ›  jo

上传时获取原始文件创建日期

  •  1
  • jo  · 技术社区  · 15 年前

    我们有一个将文件上传到我们网站的流程。对于用户来说,能够看到这些文件的创建时间变得非常重要。我正在寻找一种从httpPostedFile中提取原始创建日期的方法。如果有人对我有想法,我会非常感激的(我在这一点上有点困惑)。

    4 回复  |  直到 10 年前
        1
  •  3
  •   David    15 年前

    您无权访问在客户端上创建文件的日期。您可以使用fiddler来验证这一点。我相信只有文件名和mime类型才是发布的数据。

        2
  •  1
  •   jo    15 年前

    这就是我最终的解决方案。一旦你上传了文件并将其保存到服务器上,你就可以访问文件中的元数据(然而,这个解决方案目前只适用于图像文件——其中还有一些额外的代码,可以用来显示文件的整个元数据,如果需要的话,我发现元数据中有一些奇怪的日期格式,我对此进行了黑客攻击。可能会做得更干净……

                    System.IO.FileInfo fileInfo = new System.IO.FileInfo(UPLOAD_DIRECTORY + file.FileName);
                    if (!fileInfo.Exists)
                    {
                        break;
                    }
                    else
                    {
    
                      //Check for metadata original create date
                      if (_imageFormats.Contains(fileInfo.Extension.ToLower()))
                      {
                        Stream fileStream = fileInfo.OpenRead();
                        System.Drawing.Image image = new System.Drawing.Bitmap(fileStream);
    
                        // Get the PropertyItems property from image.
                        System.Drawing.Imaging.PropertyItem[] propItems = image.PropertyItems;
    
                        // For each PropertyItem in the array, display the ID, type, and 
                        // length.
                        int count = 0;
                        string s1 = null;
                        string dateID = null;
                        foreach (System.Drawing.Imaging.PropertyItem propItem in propItems)
                        {
                          s1 += "Property Item " + count.ToString() + "/n/r";
    
                          s1 += "iD: 0x" + propItem.Id.ToString("x") + "/n/r";
                          if (("0x" + propItem.Id.ToString("x")) == PROPERTYTAGEXIFDTORIG)
                          {
                            dateID = count.ToString();
                          }
                          s1 += "type: " + propItem.Type.ToString() + "/n/r";
    
                          s1 += "length: " + propItem.Len.ToString() + " bytes" + "/n/r";
    
                          count++;
                        }
                        // Convert the value of the second property to a string, and display 
                        // it.
                        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
                        if (dateID != null)
                        {
                          string date = encoding.GetString(propItems[int.Parse(dateID)].Value);
                          date = date.Replace("\0", string.Empty);
                          string[] datesplit = date.Split(' ');
                          string newDate = datesplit[0].Replace(":", "-") + " " + datesplit[1];
                          originalCreateDate = DateTime.Parse(newDate);
                        }
                        fileStream.Close();
                      }
    
        3
  •  0
  •   Community rohancragg    7 年前

    我尝试了上面Bryon提到的方法,但给出的日期不正确。也就是1600年左右。

    但是,您可以通过FileUpload控件的“文件”属性从“LastModifiedDate”属性中获取每个(要)上载文件的日期。

    这是它的HTML/javascript示例。 我把它从:

    http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_fileupload_files 并根据我们的需要做了一些修改。注意:请在这个HTML/javascript代码段之后阅读我下面的评论。

    <!DOCTYPE html>
    <html>
    <body onload="myFunction()">
    
    <input type="file" id="myFile" multiple size="50" onchange="myFunction()">
    
    <p id="demo"></p>
    
    <script>
    function myFunction(){
        var x = document.getElementById("myFile");
        var txt = "";
        if ('files' in myFile) {
            if (x.files.length == 0) {
                txt = "Select one or more files.";
            } else {
                for (var i = 0; i < x.files.length; i++) {
                    txt += "<br><strong>" + (i+1) + ". file</strong><br>";
                    var file = x.files[i];
                    if ('name' in file) {
                        txt += "name: " + file.name + "<br>";
                    }
                    if ('size' in file) {
                        txt += "size: " + file.size + " bytes <br>";
                    }
                    if ('lastModifiedDate' in file) {
                        txt += "lastModifiedDate: " + file.lastModifiedDate.toString();
                    }
                }
            }
        } 
        else {
            if (x.value == "") {
                txt += "Select one or more files.";
            } else {
                txt += "The files property is not supported by your browser!";
                txt  += "<br>The path of the selected file: " + x.value; // If the browser does not support the files property, it will return the path of the selected file instead. 
            }
        }
        document.getElementById("demo").innerHTML = txt;
    }
    </script>
    
    <p><strong>Tip:</strong> Use the Control or the Shift key to select multiple files.</p>
    
    </body>
    </html>
    

    例如,可以使用jquery文件上载控件将此信息作为附加参数传递。 下面是演示此问题的链接:

    jquery file upload module sending extra parameter

        4
  •  -1
  •   Byron Whitlock    15 年前

    您只需从httpPostedFile::filename中获取文件系统创建日期。

    像这样的事情:

    HttpFileCollection MyFileColl = Request.Files;
    HttpPostedFile MyPostedFile = MyFileColl.Get(0);
    String filename = MyPostedFile.FileName;
    String creationTime;
    
    if (File.Exists(fileName)) 
    {
          creationTime = File.GetCreationTime(fileName).ToString(); 
    }
    System.writeLine(creationTime);
    
    推荐文章