输入类型=“文件”自动丢失文件?

时间:2014-10-31 18:42:26

标签: html asp.net-mvc file input

我有两个类型文件的输入,一个在局部视图中,另一个在主页面

在局部视图中

<input type="file" name="image" id="image" onchange="readURL(this)"/>

在主页

<input type="file" name="userProfilePic" id="userProfilePic" style="display:none" />

我想要的是当用户在可见文件上传时更改image/file时,image/file也应该在主/其他输入上更新。这是我的代码。

function readURL(input) {
    if (input.files && input.files[0]) {
        var reader = new FileReader();

        reader.onload = function (e) {
            $('#imagePreview').attr('src', e.target.result);
        }
        reader.readAsDataURL(input.files[0]);
        // window['profilePic'] = input.files[0];
        $('#userProfilePic').get(0).files[0] = input.files[0];
        return false;
    }

错误

错误非常奇怪,当我打开我的控制台并检查文件时,它会在某个时间出现,稍后它就不会出现。

在我的控制台窗口中

$('#userProfilePic').get(0).files[0]
File (file object details)

....

(after a second)
$('#userProfilePic').get(0).files[0]
undefined

它不仅仅是第一次发生。有时说,它显示的值为5-6次,然后是第7次它赢得了......

$('#userProfilePic').get(0).files[0]
File (file object details)

....

(after a second)
$('#userProfilePic').get(0).files[0]
File (file object details)

....

(after a second)
$('#userProfilePic').get(0).files[0]
File (file object details)

....

(after a second)
$('#userProfilePic').get(0).files[0]
undefined

我拥有的所有代码,没有其他代码。现在,正如您在代码中看到的,我还将window[profilePic]设置为文件对象。但是,如果我在控制台窗口中检查它,它总是显示无论如何?这是怎么回事?

问题

我需要提交表单,但是当我这样做时,图像(输入文件)将作为空发送,但有时作为有效文件发送。正如我之前解释的那样,当我检查控制台中的值时,它会第一次显示,或者是一些随机的次数,然后突然它消失了,而我在窗口上设置的变量(window[profilePic])总是有那个文件对象 如果有人想知道,用户实际选择文件的原始/可见文件输入始终具有值。

3 个答案:

答案 0 :(得分:2)

出于安全原因,您无法执行此操作,所有通过input type="file"上传的文件都必须由用户手动完成。

但是,只要用户无论如何都要上传图片,您都应该在服务器端脚本中执行所需的所有过程。

有关详细信息,请参阅此帖:

How to set a value to a file input in HTML?

答案 1 :(得分:0)

为什么你尝试对同一个文件使用两个inputfile?

如果您尝试使用输入文件和额外数据在PartialView中创建表单?我在这里回答了一个非常相似的问题:

File upload in MVC when used in bootstrap modal returns null

1)为表单中使用的模型创建一个模型,其中包含表单的所有元素,

2)在局部视图的第一行声明模型

3)将模型作为参数传递给post函数。

4)你使用Partial视图,很可能在不同的页面中使用这个视图,你需要指定控制来处理表格。

代码中的示例:

型号:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

    public class PartialFormModel
    {
        [Required]
        [StringLength(200)]
        public string FileName { get; set; }

        [StringLength(200)]
        public string Title { get; set; }

        [StringLength(1000)]
        public string Description { get; set; }

        public int? Order { get; set; }

        [NotMapped]
        public HttpPostedFileBase ImageFile { get; set; }
    }

PartialVIEW:

@model YOURSPACENAME.Models.PartialFormModel    

@using (Html.BeginForm("YourActionName", "YourControllerName", FormMethod.Post, new { @class = "form-horizontal", @role = "form", @enctype="multipart/form-data" })) 
    {
        @Html.AntiForgeryToken()

        <div class="form-group">
                @Html.LabelFor(model => model.FileName, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.FileName, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.FileName, "", new { @class = "text-danger" })
                </div>
            </div>

    <div class="form-group">
                @Html.LabelFor(model => model.ImageFile, new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.TextBoxFor(m => m.ImageFile, new { @class = "form-control", type = "file" })
                </div>
            </div>

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-default" />
                </div>
            </div>
    }

CONTROLLER

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult YourActionName(PartialFormModel obj)
{
    if (ModelState.IsValid)
    {
        //your options
    }
    return PartialView("_EditSlider");
}

答案 2 :(得分:0)

考虑到:

  1. 出于安全原因,您无法设置输入value的{​​{1}} 编程。
  2. 更改type="file"的类型会在某些情况下引发安全性错误 浏览器(旧的IE和Firefox版本)。
  3. 我实际上并不知道你想要什么。但我叮嘱你创建一个新的<input>元素,将其类型设置为你想要的类型,比如说input,并根据你的需要设置它的属性。像这样:

    file