【问题标题】:Any workarounds for the Safari HTML5 multiple file upload bug?Safari HTML5 多文件上传错误的任何解决方法?
【发布时间】:2013-04-02 14:23:40
【问题描述】:

经过数周的调整,我终于放弃了。我只是无法修复我在 safari 上的多个文件上传,这真的让我很困扰,因为我的代码在其他浏览器上运行良好,在 safari 上除外。然后我最近才发现不是我的代码有问题。它是一个 Safari 错误。 Safari 5.1.+ 无法读取 html5 多重属性(或类似属性)。所以用户不能使用多上传功能,但是可以正常上传单个文件。

讨论该问题的链接很少:

https://github.com/moxiecode/plupload/issues/363

file input size issue in safari for multiple file selection

似乎这个错误已经存在了很长一段时间。所以我想知道你们中的一些人可能知道目前是否有可用的解决方法?因为我找不到。我发现的唯一可用选项是不为 Safari 5.1.+ 用户使用多个属性。大家有什么更好的想法吗?

更新

Safari 5.1.7 是 Apple 为 Windows 操作系统制作的最后一个版本。他们没有继续为 Windows 构建当前版本的 Safari。因为 Real Safari 用户已更新到浏览器的最新版本(没有事实),所以没有必要为我找到此错误的修复程序,只需单独上传那些仍在使用这个过时版本的人,以免牺牲应用程序的现代功能。

【问题讨论】:

  • 我已经把我的文件上传到sequentialUploads: true,我没有更多问题

标签: html safari


【解决方案1】:

这是一个老问题,但是......下面是黑客类型的解决方法。

只需将 Safari 的 multiple 属性移除,将其转换为 MSIE

其他浏览器不受影响。

当 Safari 最终解决问题时,您所要做的就是删除这个 hack::code 并返回到标准输入代码。

这是标准输入示例:

jQuery 解决方案:

只需将它放在页面上的某个位置,那里有文件输入标签。

您可以在这里阅读更多内容:How to detect Safari, Chrome, IE, Firefox and Opera browser?

$(文档).ready(函数 () { if (Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor')>0); $('.fileupload-input').removeAttr("multiple"); });

PHP 解决方案

你需要一些代码来识别浏览器我使用了我在 github (MIT) 中获得的一个类 在这里获取:https://github.com/gavroche/php-browser

$files = ''; if (Browser::getBrowser() === Browser::SAFARI) { $files = ''; } 回声$文件

就是这样。

【讨论】:

    【解决方案2】:

    似乎还有另一个问题可以解决。 iOS Safari 多文件上传始终为所有上传的文件使用名称“image.jpg”。看起来服务器端只上传了一个文件,但事实并非如此:它已经上传了所有同名文件!

    因此,解决方法进入了服务器端:只需使用新生成的名称更改目标文件名。

    我正在使用 Flask 和 Python,所以我使用标准公式。

    @app.route("/upload",methods=['POST'])
    def upload():
        files = request.files.getlist('files[]')
        for file in files:
            if file and allowed_file(file.filename):
                filename = generate_filename(file.filename)
                file.save( os.path.join(app.config['UPLOAD_FOLDER'], new_album_id, filename))
        return render_template('upload_ok.html')
    

    generate_filaname 必须是一个函数,它创建一个与原始文件扩展名相同的新文件名。例如:

    def generate_filename(sample_filename):
        # pick up extension from sample filename
        ext = sample_filename.split(".")[-1]
        name = ''.join( random.SystemRandom().choice(string.letters+string.digits) for i in range(16) )
        return name + "." + ext
    

    当然,在 PHP 中也可以做到这一点。

    【讨论】:

      【解决方案3】:

      我在使用 asp.net 时遇到了 image.jpg 问题。它可能会使某人受益。我在每个图像文件中附加了一个非唯一的哈希值,以将其与数据库中的记录联系起来。在每个平台上都可以正常工作(无论如何,我们的用户都在使用),但使用 Safari 时除外。我只是将一个哈希和一个从 DateTime 的秒部分提取的唯一三位数字符串附加到字符串:

      if (!string.IsNullOrEmpty(ViewState["HashId"].ToString()))
              {
                  string filepath = Server.MapPath("~/docs/");
                  HttpFileCollection uploadedFiles = Request.Files;
                  Span1.Text = string.Empty;
      
                  for (int i = 0; i < uploadedFiles.Count; i++)
                  {
                      HttpPostedFile userPostedFile = uploadedFiles[i];
      
                      try
                      {
                          if (userPostedFile.ContentLength > 0)
                          {
      
                              string timestamp = DateTime.UtcNow.ToString("fff",
                                                   CultureInfo.InvariantCulture);
      
                              //Span1.Text += "<u>File #" + (i + 1) + "</u><br>";
                              //Span1.Text += "File Content Type: " + userPostedFile.ContentType + "<br>";
                              //Span1.Text += "File Size: " + userPostedFile.ContentLength + "kb<br>";
                              //Span1.Text += "File Name: " + userPostedFile.FileName + "<br>";
      
                              userPostedFile.SaveAs(filepath + "\\" + ViewState["HashId"] + "_" + Path.GetFileName(timestamp + userPostedFile.FileName));
                             // Span1.Text += "Location where saved: " + filepath + "\\" + Path.GetFileName(userPostedFile.FileName) + "<p>";
                              InsertFilename("~/docs/" + ViewState["HashId"] + "_" + Path.GetFileName(timestamp + userPostedFile.FileName), ViewState["HashId"] + "_" + Path.GetFileName(timestamp + userPostedFile.FileName));
      
                          }
                      }
                      catch (Exception Ex)
                      {
                          Span1.Text += "Error: <br>" + Ex.Message;
                      }
                  }
                  BindImages();
                  SetAttchBitTrue();
                  Button4.Visible = true;
                  AttchStatus.Text = "This Record Has Attachments";
                  Button2.Visible = true;
                  Button3.Visible = true;
                  Panel1.Visible = false;
      
              }  
      

      可能是一个更好的方法,但我们只有少数人在数据库中的每条记录上传一到两张,也许三张图片。应该可以。

      【讨论】:

      • 谢谢@user1544428。它在 Chrome 中运行良好,但在 Safari 中运行良好。使用您的方法,我终于在我使用 ajax 库上传多个文件的 wordpress 站点中解决了这个问题。在为每个文件添加唯一时间戳后,问题就解决了。
      猜你喜欢
      • 1970-01-01
      • 2015-09-25
      • 2013-01-21
      • 2013-09-16
      • 2020-10-16
      • 1970-01-01
      • 2020-03-12
      • 2023-01-18
      • 2013-10-25
      相关资源
      最近更新 更多