FileStream привязывается к типу ввода = & ldquo; file & rdquo; [Дубликат]

Самая простая вещь - статические переменные или статические методы находятся на уровне класса. Переменные или методы уровня класса загружаются до методов или переменных уровня экземпляра. И, очевидно, вещь, которая не загружена, не может быть использована. Поэтому java-компилятор, не позволяющий обрабатывать вещи во время выполнения, решает во время компиляции. Вот почему он дает вам ошибку, не статические вещи не могут быть переданы из статического контекста. Вам просто нужно ознакомиться с областью уровня класса, областью уровня экземпляра и локальной областью.

58
задан Chaddeus 9 June 2009 в 03:47
поделиться

7 ответов

Браузеры разработаны таким образом из-за рисков безопасности. Невозможно установить значение поля ввода файла в источнике HTML или Javascript. В противном случае вредоносный скрипт может украсть какой-то частный файл без внимания пользователя.

есть интересная информация .

55
ответ дан Alexander Prokofyev 25 August 2018 в 14:02
поделиться
  • 1
    Да, я понимаю принцип безопасности. Просто хочу, чтобы это было возможно для сценария, который я описал, просто потому, что у меня был пользовательский опыт, которым это повлияло. ; / – Chaddeus 9 June 2009 в 06:28
  • 2
    Чтобы устранить проблему UX, которую пользователь должен будет повторно выбрать, вы можете сохранить файл во временном кеше на стороне сервера, когда форма с установленным файлом будет отправлена ​​в первый раз. Затем, если проверка не удалась, вы просто показываете имя файла (или миниатюру), чтобы указать, что это поле установлено. Как только проверка будет успешной, вы получите данные из вашего кеша. – tsauerwein 3 October 2014 в 10:15
  • 3
    @tsauerwen, хорошо, что побеждает цель модели без гражданства MVC. – Triynko 18 November 2015 в 20:11

Вы не можете установить значение поля ввода файла HTML. В качестве обходного решения замените поле загрузки файла скрытым полем ввода при выводе формы после проверки.

При представлении вы заполняете скрытое поле значением из поля ввода файла (для последующего повторного представления) , Не забудьте указать имя файла или имя скрытого поля в любой момент (не оба):

Примечание. Код ниже предназначен только для целей иллюстрации / объяснения . Замените его кодом, соответствующим используемому вами языку.

<?php /* You may need to sanitize the value of $_POST['file_upload']; 
* this is just a start */
if(isset($_POST['file_upload']) && !empty($_POST['file_upload'])){ ?>
<input type="hidden" name="file_upload" value="<?php print($_POST['file_upload']); ?>" />
<?php } else { ?>
<input type="file" name="file_upload" />
<?php } ?>
0
ответ дан Agi Hammerthief 25 August 2018 в 14:02
поделиться
  • 1
    «Помните, что у вас есть либо имя загрузки файла, либо имя скрытого поля, присутствующее в любой момент времени (не оба). & quot; Ну, а что, если после проверки пользователь изменит свое мнение и захочет выбрать другой файл? – Triynko 18 November 2015 в 20:18
0
ответ дан AGuyCalledGerald 25 August 2018 в 14:02
поделиться

Я не согласен с «невозможным», обозначенным как правильный ответ. Если кто-то все еще ищет возможность, вот работа, которая работала для меня. Я использую MVC5. Идея заключается в использовании переменной сеанса. Я получил эту идею из ASP.Net Form .

My Model / ViewModel (только соответствующие свойства):

public partial class emp_leaves
    {
        public string fileNameOrig { get; set; }
        public byte[] fileContent { get; set; }

        public HttpPostedFileBase uploadFile { get; set; }
    }

В моем контроллере (HttpPost) : // Check

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(emp_leaves emp_leaves)
{
    if (emp_leaves.uploadFile != null && emp_leaves.uploadFile.ContentLength>0 && !string.IsNullOrEmpty(emp_leaves.uploadFile.FileName))
    {
        emp_leaves.fileNameOrig = Path.GetFileName(emp_leaves.uploadFile.FileName);
        emp_leaves.fileContent = new byte[emp_leaves.uploadFile.ContentLength];
        emp_leaves.uploadFile.InputStream.Read(emp_leaves.fileContent, 0, emp_leaves.uploadFile.ContentLength);
        Session["emp_leaves.uploadFile"] = emp_leaves.uploadFile; //saving the file in session variable here
    }
    else if (Session["emp_leaves.uploadFile"] != null)
    {//if re-submitting after a failed validation you will reach here.
        emp_leaves.uploadFile = (HttpPostedFileBase)Session["emp_leaves.uploadFile"];
        if (emp_leaves.uploadFile != null && emp_leaves.uploadFile.ContentLength>0 && !string.IsNullOrEmpty(emp_leaves.uploadFile.FileName))
        {
            emp_leaves.fileNameOrig = Path.GetFileName(emp_leaves.uploadFile.FileName);
            emp_leaves.uploadFile.InputStream.Position = 0;
            emp_leaves.fileContent = new byte[emp_leaves.uploadFile.ContentLength];
            emp_leaves.uploadFile.InputStream.Read(emp_leaves.fileContent, 0, emp_leaves.uploadFile.ContentLength);    
        }
    }
//code to save follows here...
}

Наконец, в моем представлении редактирования: здесь я условно показываю управление загрузкой файла.

< script type = "text/javascript" >
  $("#removefile").on("click", function(e) {
    if (!confirm('Delete File?')) {
      e.preventDefault();
      return false;
    }
    $('#fileNameOrig').val('');
    //toggle visibility for concerned div
    $('#downloadlrfdiv').hide();
    $('#uploadlrfdiv').show();
    return false;
  }); <
/script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
@model PPMSWEB.Models.emp_leaves @{ HttpPostedFileBase uploadFileSession = Session["emp_leaves.uploadFile"] == null ? null : (HttpPostedFileBase)Session["emp_leaves.uploadFile"]; } @using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data"
})) { @Html.AntiForgeryToken()
<div class="row">
  @*irrelevant content removed*@
  <div id="downloadlrfdiv" @((!String.IsNullOrEmpty(Model.fileNameOrig) && (Model.uploadFile==n ull || uploadFileSession !=null)) ? "" : "style=display:none;")>
    <label>Attachment</label>
    <span>
            <strong>
                <a id="downloadlrf" href="@(uploadFileSession != null? "" : Url.Action("DownloadLRF", "emp_leaves", new { empLeaveId = Model.ID }))" class="text-primary ui-button-text-icon-primary" title="Download attached file">
                    @Model.fileNameOrig
                </a>
            </strong>
            @if (isEditable && !Model.readonlyMode)
            {
                @Html.Raw("&nbsp");
                <a id="removefile" class="btn text-danger lead">
                    <strong title="Delete File" class="glyphicon glyphicon-minus-sign">  </strong>
                </a>
            }
            </span>
  </div>
  <div id="uploadlrfdiv" @(!(!String.IsNullOrEmpty(Model.fileNameOrig) && Model.uploadFile==n ull) && !Model.readonlyMode ? "" : "style=display:none;")>
    <label>Upload File</label> @Html.TextBoxFor(model => model.uploadFile, new { @type = "file", @class = "btn btn-default", @title = "Upload file (max 300 KB)" }) @Html.ValidationMessageFor(x => x.uploadFile)
  </div>
</div>
}

0
ответ дан Arfath 25 August 2018 в 14:02
поделиться

Есть флеш-файлы для загрузки файлов. Попробуйте один из них. Некоторые из них даже возвращаются к обычному ящику ввода файла, если Flash и java-скрипт не поддерживаются. Советую искать jQuery-плагины.

1
ответ дан gokkor 25 August 2018 в 14:02
поделиться

Насколько я знаю, вы не можете установить значение поля ввода файла HTML. Я хотел бы предложить связать поле ввода файла с меткой или текстовым полем.

Затем вы можете заполнить его значением из поля ввода файла, которое будет повторно отправлено позже.

2
ответ дан Michael 25 August 2018 в 14:02
поделиться
  • 1
    Интересно ... знаете ли вы о сайте, который реализовал его таким образом? Ищем примеры ... спасибо. – Chaddeus 9 June 2009 в 05:48
  • 2
    Gmail использует нечто похожее со своими вложениями. После загрузки файла он превращается в текст. Однако это делается асинхронно с использованием AJAX. – Michael 9 June 2009 в 06:46

Если файл не слишком большой, вы можете использовать base64 и использовать его как значение для скрытого поля.

1
ответ дан Patrick Cornelissen 25 August 2018 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: