Чтобы асинхронно загружать файл с помощью Jquery, выполните следующие шаги:
шаг 1 В вашем проекте откройте менеджер Nuget и добавьте пакет (jquery fileupload (нужно только записать его в поле поиска, он появится и установит it.)) URL: https://github.com/blueimp/jQuery-File-Upload
Шаг 2 Добавьте ниже сценарии в файлы HTML, которые уже добавлены в проект, выполнив над пакетом:
jquery.ui.widget.js
jquery.iframe-transport.js
jquery.fileupload.js
Шаг 3 Запишите управление загрузкой файлов в соответствии с приведенным ниже кодом:
шаг 4 напишите js-метод как uploadFile, как показано ниже:
function uploadFile(element) { $(element).fileupload({ dataType: 'json', url: '../DocumentUpload/upload', autoUpload: true, add: function (e, data) { // write code for implementing, while selecting a file. // data represents the file data. //below code triggers the action in mvc controller data.formData = { files: data.files[0] }; data.submit(); }, done: function (e, data) { // after file uploaded }, progress: function (e, data) { // progress }, fail: function (e, data) { //fail operation }, stop: function () { code for cancel operation } }); };
шаг 5 В процессе загрузки файла элементов готовой функции, чтобы инициировать процесс, как показано ниже:
$(document).ready(function() { uploadFile($('#upload')); });
Шаг 6 Запишите контроллер MVC и действие, как показано ниже:
public class DocumentUploadController : Controller { [System.Web.Mvc.HttpPost] public JsonResult upload(ICollection
files) { bool result = false; if (files != null || files.Count > 0) { try { foreach (HttpPostedFileBase file in files) { if (file.ContentLength == 0) throw new Exception("Zero length file!"); else //code for saving a file } } catch (Exception) { result = false; } } return new JsonResult() { Data=result }; } }
Потребность в возможном желании воспроизводимых результатов, которые могут возникнуть, например, при попытке отладки вашей программы или, конечно, от попыток повторить то, что она делает:
Эти два результата мы «никогда не будем» «воспроизводятся, поскольку я просто попросил что-то« случайное »:
R> sample(LETTERS, 5)
[1] "K" "N" "R" "Z" "G"
R> sample(LETTERS, 5)
[1] "L" "P" "J" "E" "D"
Эти два, однако, идентичны , потому что я установил семя :
R> set.seed(42); sample(LETTERS, 5)
[1] "X" "Z" "G" "T" "O"
R> set.seed(42); sample(LETTERS, 5)
[1] "X" "Z" "G" "T" "O"
R>
Во всем этом есть обширная литература; Википедия - хорошее начало. В сущности, эти ГСЧ называются генераторами псевдослучайных чисел, поскольку они на самом деле полностью алгоритмические : при одном и том же семя вы получаете одну и ту же последовательность. И это является признаком , а не ошибкой.
Вы должны установить семя каждый раз, когда хотите получить воспроизводимый случайный результат.
set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)
Фиксация семени имеет важное значение, когда мы пытаемся оптимизировать функцию, которая включает произвольно сгенерированные числа (например, при оценке на основе моделирования). Говоря кратко, если мы не зафиксируем семя, изменение из-за рисования разных случайных чисел, скорее всего, приведет к сбою алгоритма оптимизации.
Предположим, что по какой-либо причине вы хотите оценить стандартное отклонение ( sd) среднего нулевого нормального распределения путем моделирования, с учетом выборки. Это может быть достигнуто путем выполнения численной оптимизации вокруг этапов
Следующие функции делают это один раз без шага 1. один раз включив его:
# without fixing the seed
simllh <- function(sd,y,Ns){
simdist <- density(rnorm(Ns,mean=0,sd=sd))
llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
return(-sum(log(llh)))
}
# same function with fixed seed
simllh.fix.seed <- function(sd,y,Ns){
set.seed(48)
simdist <- density(rnorm(Ns,mean=0,sd=sd))
llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
return(-sum(log(llh)))
}
Мы можем проверить относительная производительность двух функций при обнаружении истинного значения параметра с коротким исследованием Монте-Карло:
N <- 20; sd <- 2 # features of simulated data
est1 <- rep(NA,1000); est2 <- rep(NA,1000) # initialize the estimate stores
for(i in 1:1000){
as.numeric(Sys.time())-> t; set.seed((t - floor(t)) * 1e8 -> seed) # set the seed to random seed
y <- rnorm(N,sd=sd) # generate the data
est1[i] <- optim(1,simllh,y=y,Ns=1000,lower=0.01)$par
est2[i] <- optim(1,simllh.fix.seed,y=y,Ns=1000,lower=0.01)$par
}
hist(est1)
hist(est2)
Результирующие распределения оценок параметров:
Когда мы фиксируем семена, числовой поиск заканчивается ближе к истинному значению параметра 2 намного чаще.
Просто добавьте некоторые дополнительные аспекты. Необходимость установки семени: в академическом мире, если кто-то утверждает, что его алгоритм достигает, скажем, 98,05% производительности в одном симуляции, другие должны иметь возможность воспроизвести его.
?set.seed
Прохождение файла справки этой функции, это некоторые интересные факты:
(1) set.seed () возвращает NULL, invisible
(2) «Первоначально нет семени; новый из них создается из текущего времени и идентификатора процесса, когда требуется, поэтому разные сеансы будут давать разные результаты моделирования по умолчанию. Однако семя может быть восстановлено с предыдущего сеанса, если восстановлено ранее сохраненное рабочее пространство ». , поэтому вам нужно будет вызвать set.seed () с одинаковыми целыми значениями в следующий раз, когда вы захотите получить одну и ту же последовательность случайной последовательности.
blockquote>
в основном set.seed () поможет повторно использовать один и тот же набор случайных величин, которые нам понадобятся в будущем, чтобы снова оценить конкретную задачу снова с помощью тех же случайных varibales
, нам просто нужно объявить это перед использованием любой функции генерации случайных чисел.