在onedrive(skydrive)上传多个文件?

时间:2014-12-12 07:58:04

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

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

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

这就是我的尝试:

 <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));
        }
        );

感谢。

2 个答案:

答案 0 :(得分:0)

由于我记得弄乱了input[file]元素,出于安全原因,您无法像这样设置input[file]的值。

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

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

答案 1 :(得分:0)

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

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");
    }