【问题标题】:Multiple files upload in onedrive (skydrive)?在onedrive(skydrive)中上传多个文件?
【发布时间】:2015-02-10 21:39:34
【问题描述】:

可以使用 WL.upload 在 onedrive(skydrive) 中上传多个文件吗?我尝试了一些东西,但我总是得到一个错误,比如“元素必须是 html 输入元素”或类似的东西。我使用 onedrive sdk 5.6,应用程序是在 ASP.NET MVC 5 中构建的。问题是我创建了一个 type="file" 的输入,并设置了多个属性,因此我可以从我的计算机中选择多个文件,但上传方法来自WL api 请求一个元素属性,该属性实际上是 type="file" 的输入元素的 id。因为我的输入设置为多个,所以我尝试遍历包含的文件并创建一个输入元素以传递给该方法,但它不起作用,因为出于安全原因,我可以设置输入元素的值。

那么,有人知道我该怎么做吗?谢谢

这是我尝试过的:

 <div id="save-to-skydrive-dialog-content-multiple">
        <p>select a file</p>
        <form enctype='multipart/form-data' method='POST'>
            <input id="save-to-skydrive-file-input-multiple" type="file" name="files[]" multiple />
        </form>
        <p>upload file</p>
        <button id="save-to-skydrive-upload-multiple-button">upload multiple</button>
 </div>

function saveMultipleToSkyDrive() {
        WL.fileDialog({
            mode: 'save'
        }).then(function (response) {
            var folder = response.data.folders[0];

            var elements = document.getElementById("save-to-skydrive-file-input-multiple").files;

            for (var i = 0; i < elements.length; i++) {

                var htmlInPutElement = document.createElement('input');
                htmlInPutElement.setAttribute('type', 'file');
                htmlInPutElement.value = elements.item(i);

                WL.api({

                })

                WL.upload({
                    path: folder.id,
                    element: htmlInPutElement,
                    overwrite: 'rename'
                }).then(function (response) {
                    log("You save to" + response.source + ". " + "Below is the result of the upload");
                    log("");
                    log(JSON.stringify(response));
                },
                    function (errorResponse) {
                        log("WL.upload errorResponse = " + JSON.stringify(errorResponse));
                    },
                    function (progress) {
                    });
            }
        }, function (errorResponse) {
            log("WL.upload errorResponse = " + JSON.stringify(errorResponse));
        }
        );

谢谢。

【问题讨论】:

  • 我更新了问题。

标签: javascript asp.net-mvc-4 onedrive


【解决方案1】:

根据我对input[file] 元素的记忆,出于安全原因,您不能像那样设置input[file] 的值。

            var htmlInPutElement = document.createElement('input');
            htmlInPutElement.setAttribute('type', 'file');
            htmlInPutElement.value = elements.item(i);

解决方案是将文件发布到您的controller 上的临时action,然后在action 方法中执行OneDrive API 内容。你可以遍历Request.Files(虽然使用multiple 属性可能会很棘手,但我学到了很艰难的方法——有关更多信息,请参阅this post

【讨论】:

  • 我知道由于安全原因我无法设置输入[文件]的值,而且我还想在控制器中创建逻辑,但问题是我想做所有的事情在 javascript 中,我不想使用控制器中的任何操作方法。
  • 嗯,这是我知道的唯一方法。唯一的另一种方法是从单独的文件输入开始,而不是使用多个属性
  • 感谢您的回答。我也认为可能有一种方法可以从微软提供的 api 向方法发送参数。到目前为止,我只找到带有 input[file] 的方法(我刚开始学习 OneDrive sdk)。
  • 经过一番搜索后,我找到了一种方法。不幸的是,我找不到从 javascript 上传多个文件的方法,只能从 c# 代码上传。我在这里发布解决方案,也许它可以帮助某人。
【解决方案2】:

我找到了答案,但不是在 javascript 中,在 c# 代码中。

HTML 输入:

 <p>Upload Files</p>
<div id="save-to-skydrive-dialog-content">
    @using (Html.BeginForm("UploadFiles", "Auth", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <input type="file" name="file" multiple />
        <input type="submit" value="Upload File"/>
    }
</div>

C#方法:

[HttpPost]
    public async Task<ActionResult> UploadFiles()
    {
        var files = Request.Files;

        if (Request.Files.Count > 0)
        {
            LiveLoginResult loginStatus = await authClient.InitializeWebSessionAsync(HttpContext);
            if (loginStatus.Status == LiveConnectSessionStatus.Connected)
            {
                connectedClient = new LiveConnectClient(this.authClient.Session);
                LiveOperationResult result = await connectedClient.GetAsync("me/skydrive");
                string folderId = (string)result.Result["id"];

                for (var i = 0; i < Request.Files.Count; i++)
                {
                    var fileName = Request.Files[i].FileName;
                    var fileStream = Request.Files[i].InputStream;

                    LiveOperationResult uploadResult = await connectedClient.UploadAsync(folderId, fileName, fileStream, OverwriteOption.Overwrite);
                }
            }
        }
        return View("~/Views/Home/Index.cshtml");
    }

【讨论】:

  • 欢迎您!将来也许我会在javascript中找到一种方法!
猜你喜欢
  • 2012-08-20
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多