Я сделал это раньше для своей Dropzone. Не стесняйтесь настраивать. Это из моего приложения Laravel. Вы должны сосредоточиться на avatar_refresh_upload
.
function avatar_refresh_upload() {
var input = $('input#avatar[type=file]');
input.replaceWith(input.val('').clone(true));
$('#selected_file').html('{{ Lang::get('app.profile_avatar_select') }}');
$('#avatar_refresh_upload').removeAttr('style');
}
$(document).ready(function ($) {
$('input:file#avatar').change(function () {
var file_name = $(this).val();
if (file_name.length > 10) {
file_name = file_name.substring(0, 10) + '...';
}
$('#selected_file').html('File "' + file_name + '" chosen');
$('#avatar_refresh_upload').css('display', 'inline-block');
});
$('#avatar_refresh_upload').on('click', function () {
avatar_refresh_upload();
});
@if ($user->avatar != '')
$('#remove_avatar').change(function () {
if ($(this).is(':checked')) {
avatar_refresh_upload();
$('#avatar').prop('disabled', true);
$('#avatar_preview').css('opacity', '0.5');
$('#avatar_upload_form_area').css('opacity', '0.5');
$('#remove_avatar_info').show();
} else {
$('#avatar').prop('disabled', false);
$('#avatar_preview').removeAttr('style');
$('#avatar_upload_form_area').removeAttr('style');
$('#remove_avatar_info').removeAttr('style');
}
});
@endif
});
Короче говоря, если вы хотите сбросить входной файл после того, как вы выбрали файл для загрузки, но перед отправкой вам нужно запустить:
input.replaceWith(input.val('').clone(true));
После некоторого дальнейшего исследования эта проблема, по-видимому, не вызвана непосредственно aiohttp
/ asyncio
, а скорее ограничениями / ограничениями, вытекающими из обоих:
Во-первых, для тех, кто хочет получить некоторые усиленные DNS-серверы (я, вероятно, не буду идти по этому пути), варианты с громкими именами выглядят так:
( Хорошее введение в DNS для таких, как я для которых отсутствуют сетевые концепции.)
Первое, что я сделал, - запустил вышеописанное на расширенном экземпляре AWS EC2 - h1.16xlarge с Ubuntu, оптимизированной для ввода-вывода. Я не могу сказать, что это само по себе помогло, но это, конечно, не повредит. Я не слишком знаком с DNS-сервером по умолчанию, используемым экземпляром EC2, но ошибка OSError с errno == 8, приведенная выше, исчезла при репликации вышеуказанного сценария.
Однако, на его месте появилось новое исключение, OSError с кодом 24, «Слишком много открытых файлов». Мое решение исправления (не утверждая, что это самый устойчивый или самый безопасный) состояло в том, чтобы увеличить максимальные пределы файла. Я сделал это через:
sudo vim /etc/security/limits.conf
# Add these lines
root soft nofile 100000
root hard nofile 100000
ubuntu soft nofile 100000
ubuntu hard nofile 100000
sudo vim /etc/sysctl.conf
# Add this line
fs.file-max = 2097152
sudo sysctl -p
sudo vim /etc/pam.d/commmon_session
# Add this line
session required pam_limits.so
sudo reboot
Я по общему признанию чувствую себя вокруг в темноте, но соединение этого с asyncio.Semaphore(1024)
(пример здесь ) привело к ровно 0 из любых двух исключений выше
# Then call this from bulk_get with asyncio.Sempahore(n)
async def bounded_get(sem, url, session) -> str:
async with sem:
return await get(url, session)
Из ~ 25 тыс. входных URL-адресов только ~ 100 GET-запросов возвращали исключения, в основном из-за того, что сайты законно ломались, а общее время до завершения приходило в течение нескольких минут, что приемлемо в Мое мнение.