Как я могу автоматически открывать выбор файла, а не нажимать кнопку «Загрузить»? [Дубликат]

  import java.io.BufferedWriter;  импортировать java.io.FileWriter;  import java.io.IOException;  import java.io.PrintWriter;  public class Writer {public static void main (String args []) {doWrite ("output.txt", "Содержимое для добавления в файл");  } public static void doWrite (String filePath, String contentToBeAppended) {try (FileWriter fw = new FileWriter (filePath, true); BufferedWriter bw = new BufferedWriter (fw); PrintWriter out = new PrintWriter (bw)) {out.println (contentToBeAppended  );  } catch (IOException e) {// Запись / открытие файла на каком-то этапе.  }}}  
72
задан tamakisquare 21 December 2011 в 21:44
поделиться

12 ответов

Если вы хотите иметь свою собственную кнопку для загрузки файла вместо использования <input type="file" />, вы можете сделать что-то вроде:

<input id="myInput" type="file" style="visibility:hidden" />
<input type="button" value="Show Dialog" onclick="$('#myInput').click();" />

Обратите внимание, что я использовал visibility: hidden вместо display: none. Вы не можете вызывать событие клика на не отображаемом входе файла.

112
ответ дан thiagowfx 15 August 2018 в 21:42
поделиться
  • 1
    Простой для основных случаев, но не совместим со многими браузерами. Имейте в виду, что гораздо лучше объединить это решение с наложением элемента ввода файла над кнопкой на непрозрачность: 0, как было упомянуто в ответе Xeon06. – SquareCat 6 October 2013 в 14:08
  • 2
    Обновление. В современных браузерах вы можете щелкнуть ввод, даже не находящийся в DOM. Потрясающие! – Adria 8 October 2014 в 20:53
  • 3
    я просто попробовал click() на входе display:none, и он работал – Daniel Cheung 27 June 2015 в 12:44
  • 4
    Да, здесь, в 2015 году, click() на элементе с display: none работает! ;) Как все изменилось за последние четыре года. – ffxsam 26 November 2015 в 06:41

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

1
ответ дан Alex Turpin 15 August 2018 в 21:42
поделиться
  • 1
    OP говорит о <input type="file">, а не <select>. – Bojangles 21 December 2011 в 21:47
  • 2
    @ JamWaffles, я читал это слишком быстро. Благодарю. – Alex Turpin 21 December 2011 в 21:52
  • 3
    Не проблема. Я уже делал это сам. В ответ на ваше редактирование, есть способ сделать это; путем запуска события щелчка элемента с помощью jQuery $.click(). – Bojangles 21 December 2011 в 21:54
  • 4
    @JamWaffles все в порядке, это странно. Я, очевидно, помню, как целый день провел целый день. В Firefox и IE он не работал. Интересно, что это за сделка ... – Alex Turpin 21 December 2011 в 22:00
  • 5
    Хорошая исследовательская работа! Если я пойду за копейки за каждый раз, когда веб-разработчикам пришлось что-то взломать какое-то нормальное поведение, я был бы грязным. – Bojangles 21 December 2011 в 22:10

Натурально единственный способ - создать элемент <input type="file">, а затем имитировать щелчок, к сожалению.

Там крошечный плагин (бесстыдный плагин), который избавит вас от необходимости делать все это время: файл-диалог

fileDialog()
    .then(file => {
        const data = new FormData()
        data.append('file', file[0])
        data.append('imageName', 'flower')

        // Post to server
        fetch('/uploadImage', {
            method: 'POST',
            body: data
        })
    })
2
ответ дан Alister Norris 15 August 2018 в 21:42
поделиться

Я не уверен, как браузеры обрабатывают клики по элементам type="file" (проблемы безопасности и все), но это должно работать:

$('input[type="file"]').click();

Я протестировал этот JSFiddle в Chrome, Firefox и Opera, и все они показывают диалог просмотра файлов.

12
ответ дан Bojangles 15 August 2018 в 21:42
поделиться
  • 1
    +1, также работает в IE7 +, поскольку jQuery 1.7 – Alex Turpin 21 December 2011 в 22:10
  • 2
    @ Xeon06 Спасибо за тестирование. – Bojangles 21 December 2011 в 22:12
  • 3
    Это, похоже, работает только тогда, когда "вызов" событие само по себе является событием клика. Например, не представляется возможным открыть диалоговое окно файла, основанное на событии hover: jsfiddle.net/UQfaZ/1 – Louis B. 25 February 2013 в 22:20
  • 4
    Вы знаете, как это можно протестировать с помощью Selenium, если вход не находится в DOM? – Sebastien Lorber 18 February 2016 в 11:24

В большинстве ответов отсутствует полезная информация:

Да, вы можете программным образом щелкнуть элемент ввода с помощью jQuery / JavaScript, но только если вы сделаете это в обработчике событий, принадлежащем событию, которое НАЧАЛОСЬ ПОЛЬЗОВАТЕЛЕМ!

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

PS Ключевое слово debugger; нарушает окно просмотра, если оно находится перед программным щелчком ... по крайней мере, в хроме 33 ...

87
ответ дан Chris Happy 15 August 2018 в 21:42
поделиться
  • 1
    как @LouisBataillard справедливо упоминает: не только первоначальный обработчик событий должен быть инициирован пользователем; он должен быть специально событием клика. Вот сценарий, который он предоставил, демонстрируя это: link – Souhaieb Besbes 16 June 2015 в 14:58
  • 2
    вы можете щелкнуть что-то динамически генерируемое. в jquery, то есть $(staticElementParent).on("click", "dynamicChild", function(){}) – Daniel Cheung 27 June 2015 в 12:47
  • 3
    СПАСИБО!!!! Я тестировал все эти ответы в консоли javascript, и я собирался сходить с ума! – jdkealy 12 January 2016 в 18:41
  • 4
    Я боролся в течение получаса, запрограммировав окно ввода файлов. NOBODY ELSE заявила, что это невозможно, если событие не запускается пользователем ... вы заслуживаете много +1. – Umagon 17 April 2016 в 05:36
  • 5
    Кроме того, глубина стека, похоже, имеет значение. В этом примере работает только первая кнопка: jsfiddle.net/fhfos5c4 (Mac OS 10.12, Chrome 54.0.2840.98) – geon 17 November 2016 в 15:58

Лучшее решение работает во всех браузерах .. даже на мобильных устройствах.

<div class="btn" id="s_photo">Upload</div>

<input type="file" name="s_file" id="s_file" style="opacity: 0;">';

<!--jquery-->

<script>
    $("#s_photo").click(function() {
        $("#s_file").trigger("click");
    });
</script>

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

2
ответ дан hev1 15 August 2018 в 21:42
поделиться
  • 1
    вы должны упомянуть, что для этого требуется ссылка jquery. – Brino 15 May 2015 в 13:17
  • 2
    Вы правы, сделали .. – Pessa 15 May 2015 в 13:26
  • 3
    Непрозрачность подразумевает совершенно несвязанную концепцию - вам просто повезло, если она не влияет на ваш макет с помощью «проспекта», элемент. Элемент должен быть там, но не видимым, поэтому visibility:hidden должен быть лучшим выбором. – conny 23 June 2015 в 07:03
  • 4
    visibility: hidden все еще влияет на макет. display: none - это то, что вы хотите. – Jop V. 13 September 2016 в 11:15

Убедитесь, что вы используете привязку, чтобы получить компонентные реквизиты в REACT

class FileUploader extends Component {
  constructor (props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
   onChange=(e,props)=>{
    const files = e.target.files;
    const selectedFile = files[0];
    ProcessFileUpload(selectedFile,props.ProgressCallBack,props.ErrorCallBack,props.CompleatedCallBack,props.BaseURL,props.Location,props.FilesAllowed);
  }
   handleClick = () => {
    this.refs.fileUploader.click();
  }
  render()
  {
  return(
      <div>
        <button type="button" onClick={this.handleClick}>Select File</button>  
        <input type='file' onChange={(e)=>this.onChange(e,this.props)} ref="fileUploader" style={{display:"none"}} />
      </div>)
  }
}
0
ответ дан m-farhan 15 August 2018 в 21:42
поделиться

Только для записи есть альтернативное решение, которое не требует javascript.

Вам нужен <label> с соответствующим атрибутом for (указывает на ввод) , optionnaly, как кнопка (с бутстрапом, используйте btn btn-default). Когда пользователь нажимает на метку, открывается диалоговое окно, например:

<!-- optionnal, to add a bit of style -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>

<!-- minimal setup -->
<label for="exampleInput" class="btn btn-default">
  Click me
</label>
<input type="file" id="exampleInput" style="display: none" />

53
ответ дан m_x 15 August 2018 в 21:42
поделиться

Используя jQuery, вы можете вызвать click() , чтобы имитировать щелчок.

1
ответ дан pdubs 15 August 2018 в 21:42
поделиться

Я обертываю input[type=file] в теге метки, а затем стилю label по вашему вкусу и скрываю input.

<label class="btn btn-default fileLabel" data-toggle="tooltip" data-placement="top" title="Upload">
    <input type="file">
    <span><i class="fa fa-upload"></i></span>
</label>

<style>
    .fileLabel input[type="file"] {
        position: fixed;
        top: -1000px;
    }
</style>

Чисто CSS-решение.

2
ответ дан Ponyboy 15 August 2018 в 21:42
поделиться

Это сработало для меня:

$('#fileInput').val('');
0
ответ дан Undo 15 August 2018 в 21:42
поделиться

Для тех, кто хочет того же, но использует React

openFileInput = () => {
    this.fileInput.click()
}

<a href="#" onClick={this.openFileInput}>
    <p>Carregue sua foto de perfil</p>
    <img src={img} />
</a>
<input style={{display:'none'}} ref={(input) => { this.fileInput = input; }} type="file"/>
0
ответ дан Vinicius Lima 15 August 2018 в 21:42
поделиться
Другие вопросы по тегам:

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