6

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

讨论该问题的几个链接:

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

Safari中的文件输入大小问题用于多个文件选择

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

更新

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

4

3 回答 3

1

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

只需删除Safari 的多个属性,将其转换为 MSIE<=9 小兄弟(非 XHR)。

其余浏览器不会受到影响。

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

这是标准输入样本:

<input class="fileupload-input" type="file" name="files[]" 多个 />

jQuery解决方案:

只需将它放在页面上的某个位置,您可以在其中有文件输入标签。

您可以在这里阅读更多内容:如何检测 Safari、Chrome、IE、Firefox 和 Opera 浏览器?

$(文档).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 = '<input class="fileupload-input" type="file" name="files[]" 多个 />';
 if (Browser::getBrowser() === Browser::SAFARI) {
    $files = '<input class="fileupload-input" type="file" name="files[]" />';
 }
回声$文件

就这些。

于 2013-07-07T19:50:00.967 回答
0

我遇到了 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;

        }  

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

于 2018-10-10T18:36:42.640 回答
0

似乎还有另一个问题可以解决。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')

Wheregenerate_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 中完成。

于 2016-02-27T16:14:50.457 回答