2013-08-02 37 views
5

我不问如何上传文件。HTML文件输入如何工作?

我只是想知道,当你点击一个html文件元素时,它显示了 本地系统文件夹。

我们可以使用按钮和输入等任何其他html元素吗?如果不是,文件有什么特别之处?它如何显示系统目录?

+4

它做的浏览器,而不是与HTML。你用纯HTML(和Javascript)所做的任何事情都不会让你直接访问客户端的文件系统。你需要一些第三方软件如Flash或ActiveX来做到这一点。从服务器的角度来看,当你上传一个文件时,你只是发出一个包含八位字节流的HTTP请求。 – Renan

+0

谢谢。但问题依然存在。如果它是与浏览器,而不是与HTML为什么只有文件可以执行该? – zod

+0

@zod浏览器自动将自己的样式应用于页面上的HTML元素的相同原因 - 浏览器如何使用'file'的类型属性进行呈现和输入。 IE:除非您使用密码字段,否则无法将文本显示为•••••(或javascript并替换字符,但这不是一回事。) – Jacques

回答

0

可以让你访问文件系统的唯一html元素是input(文件类型),因为浏览器允许它显示一个打开的对话框,只有浏览器可以做到这一点,任何脚本API都没有办法访问系统目录。出于安全原因,目前没有其他方法可以通过这种方式访问​​文件系统(通过对话框);通过HTML5在本地保存数据,强制下载保存对话框或打印对话框都是浏览器控制的操作,但您可以从网页调用它们。

2

通知:我不会准确描述浏览器如何处理文件输入,但我会逐步列出我所做的工作及其结果,以更好地理解输入;虽然它可能无助于理解其内部机制,但它可以帮助您在使用它时不会感到害怕或困惑。在我的实验中,我将使用HTML,Apache + PHP和CakePHP,Firefox和Chrome来比较它在现实世界编程中的使用方式。让我们开始:)

  1. 当选择上传文件时是否将内容输入到内存?
    • 不,它只是保存文件路径。我使用进程监视器,然后选择近200Mb的文件,Chrome和Firefox都不吃更多的内存,或者读取磁盘;点击提交按钮之前,我甚至可以删除此文件。
  2. 如何将输入的表单效果的enctype?
    • application/x-www-form-urlencoded and text/plain似乎IGNORE文件输入;只有multipart/form-data才会触发浏览器从文件路径读取文件并发送。 (查看更多enctype的工作方式请参考:What does enctype='multipart/form-data' mean?
  3. 服务器端在接收数据时会做什么?
    • 正如上面所说的,我只关心PHP,什么PHP给我们的是:
// Upload 1 file Array (
    [<input name in file input tag>] => Array 
     (
      [name] => <same as the name of selected to upload file> 
      [type] => <type> 
      [tmp_name] => <path of file in tmp folder will explain below> 
      [error] => <0: error, maybe because of file size too large, 1: success> 
      [size] => <size of file in bytes> 
     )  
) 
// Upload multiple files (input name must be <someName>[]) 
Array 
(
    [<input name in file input tag>] => Array 
     (
      [name] => [<array of name>] 
      [type] => [<array of type>] 
      [tmp_name] => [<array of tmp path>] 
      [error] => [<array of error>] 
      [size] => [<array of size>] 
     ) 

) 

浏览器发送请求(包含文件)到Apache; Apache将请求转发给PHP; PHP从请求中提取文件并保存到tmp文件夹中的文件,我们可以在[tmp_name]中看到该文件。在PHP文件的末尾,它删除临时文件,因此如果需要保存文件,我们必须在脚本结束之前使用move_uploaded_file

  1. CakePHP如何处理上传的文件?
    • 这是一样什么PHP也只是把它放在$这个 - >要求,我们必须确保他们的名字必须是数据[]或只是简单地使用$这 - >形式 - >形式(“”)
  2. 我可以在提交给服务器之前预览图像或对所选文件执行某些操作吗?
    • 是的。您可以收听onchange文件输入事件;通过它DOM,我们可以访问FileList,然后从它可以访问File;随着的FileReader(几乎在当前浏览器的支持),我们可以把它读作数据网址...(可以看到这里的细节:how to preview a image before and after upload?