Загрузка файлов с помощью JQuery и ASP.NET Generic Handler - возможно ли это? - PullRequest
7 голосов
/ 11 февраля 2011

Я пытаюсь решить небольшую проблему. Я создал целое веб-приложение ASP.NET, используя в основном код на стороне клиента (JQuery / JavaScript). Я использую универсальные обработчики для ленивой загрузки данных, а также для автозаполнения и тому подобного.

Одним из требований является то, что одна страница должна иметь возможность загружать файл, а также отображать метаинформацию о файлах загрузки.

Мне интересно, есть ли способ загрузить файл полностью из JQuery / JavaScript. Я исследовал целый ряд плагинов, но все они полагаются на PHP-бэкэнд.

Я думал создать сообщение:

$(function(){
    $('#submit').live('click', function(event){

        $.post('/SomeOtherHandler.ashx',  //can be '/someotherpage.aspx'
        { 
            filename: $('#fileUpload').val(), 
            timestamp: (new Date()).toString() 
        }, function(data){
             //do something if the post is successful.
        });

    });
});

Будет ли это работать? Я знаю, что если вы включите объект json { filename: value, timestamp: value }, он появится в коллекции HttpContext.Request.Params, где я смогу прочитать его без проблем.

Однако проблема в том, что я не знаю, как это будет работать, поскольку элемент управления FileUpload html сохраняет только имя файла в его значении. Поэтому я отправляю на сервер строку с именем файла, а не массив байтов.

Любые мысли по этому поводу будут с благодарностью!

Ответы [ 6 ]

4 голосов
/ 11 февраля 2011

Я использую плагин uploadify (http://www.uploadify.com/) - как сказал Джереми, он не в javascript - это невозможно. Это во флэш-памяти. Его очень легко установить.uploadify.ashx:

public class uploadify : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        System.Web.HttpPostedFile file = context.Request.Files["Filedata"];

        //Check extension
        string extension = "";
        try
        {
            extension = file.FileName.Split('.')[file.FileName.Split('.').Length - 1];
            if (extension != "xls" & extension != "xlsx" & extension != "csv") throw new Exception("Error of the extension");
        }
        catch
        {
            context.Response.Write("{\"error\",\"Error with the extension of the file\"");
        }


        string linkFile = System.Web.HttpContext.Current.Server.MapPath("~") + "uploads" + "\\" + DateTime.Now.ToString("yyMMddHHmm") + APIReportPro.DocumentPDF.RandomString(4) + "." + extension;

        file.SaveAs(linkFile);


  ...etc...

Это лучшее решение, которое я нашел для asp.net

3 голосов
/ 11 февраля 2011

У вас есть то, что сводится к трем вариантам при загрузке файлов на сервер.Вы можете использовать встроенные функции загрузки файлов HTML, Flash или Java.Javascript не может загрузить файл на сервер, он может только украшать встроенные функции HTML.С учетом сказанного я могу только предположить, что вы пытаетесь имитировать Ajax, например, функцию загрузки.Если это так, есть способ загрузить файлы, используя iframe, который будет выглядеть так, как будто вы используете ajax.

Вы будете создавать форму

<form id="file_upload_form" method="post" enctype="multipart/form-data" action="upload.aspx">
    <input name="file" id="file" size="27" type="file" /><br />
    <input type="submit" name="action" value="Upload" /><br />
    <iframe id="upload_target" name="upload_target" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>
</form>

Эта форма использует фрейм iframe для публикации файла, в результате чего главная страница никогда не обновляется.Вы можете подключить свой jquery для обработки ответа, возвращаемого iframe, и обработки пользовательской информации.

Если это не та часть уравнения, которую вы искали, пожалуйста, не стесняйтесь комментировать и уточнять, чего вы хотите достичь.

2 голосов
/ 11 февраля 2011

Если вы можете указать, через какие браузеры вы получаете доступ к вашему приложению (например, это внутреннее бизнес-приложение), стоит проверить новый Файловый API , который является частью стека технологий "HTML5", которые начинают появляться в последних браузерах. Это дает вам прямой доступ к файлам через клиентский Javascript без необходимости сначала публиковать файл на сервере.

Если ваше приложение является общедоступным, то вы все равно можете использовать File API, но вам нужно будет проверить его поддержку в своем коде и применить какой-нибудь механизм отката (например, * 1007). * Uploadify ) для более старых браузеров.

Вы можете узнать больше о Файловом API здесь и здесь среди других мест.

1 голос
/ 11 февраля 2011

Я почти уверен, что это невозможно; если это так, то это большая дыра в безопасности - Javascript не должен получать байты с жесткого диска пользователя.

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

НТН.

0 голосов
/ 23 ноября 2011

Используя jquery, вы можете сделать что-то вроде:

<input type="file" name="file" id="file1" runat="server" />

$("#<%=file1.ClientID%>").change(function () {
  //Do stuff
   $(this).upload('youHandler.ashx', function (res) {
     //do stuff on success
   }
}

Теперь на yourHandler.ashx вы можете сделать что-то подобное:

public void ProcessRequest(HttpContext context)
{
   if (context.Request.Files.Count > 0)
   {
      var fileCount = context.Request.Files.Count;
      var fileStram = var file = context.Request.Files[0].InputStream;

      //Do whatever you want
   }
}
0 голосов
/ 16 августа 2011

Я реализовал обработчик ASP.NET для загрузки файла с помощью Values ​​ajax Upload control.Вы можете проверить решение здесь.Вы также можете загрузить большой файл.Этот обработчик поддерживает браузеры IE, FF и Chrome.Вы также можете перетащить несколько файлов из FF и Chrome (HTML 5)

http://ciintelligence.blogspot.com/2011/05/aspnet-server-side-handler-for-valums.html

...