H.AL Ответов: 1

Fileupload.hasfile, переданный из javascript в webmethod, возвращает false


Чтобы избежать обратной отправки и загрузки страниц, я придумал метод JavaScript, который берет выбранный файл и загружает его на сервер. Но всякий раз, когда мой метод проверяет, является ли HasFile истинным или ложным, ответ всегда ложен. Конечно, потому что я не реализую свои элементы управления в ASP:UpdatePannel, и нет никаких триггеров для обратной передачи моего кода при нажатии кнопки загрузки. Итак, теперь мой вопрос таков: можно ли в любом случае передать заполненный файл моему вебметоду? Ниже приведен мой веб-метод:

Public Function UploadImages(ByVal fileUpload As FileUpload) As UploadedImage

    Dim uploadedImage As New UploadedImage

    Dim path As String = Server.MapPath("~/UploadedImages/")
    Dim fileOK As Boolean = False
    Try
        If fileUpload.HasFile Then
            Dim fileExtension As String
            fileExtension = System.IO.Path. _
                GetExtension(fileUpload.FileName).ToLower()
            Dim allowedExtensions As String() = _
                {".jpg", ".jpeg", ".png", ".gif"}
            For i As Integer = 0 To allowedExtensions.Length - 1
                If fileExtension = allowedExtensions(i) Then
                    fileOK = True
                End If
            Next
            If fileOK Then
                Try
                    fileUpload.PostedFile.SaveAs(path & _
                         fileUpload.FileName)
                    uploadedImage.Success = "File uploaded!"
                Catch ex As Exception
                    uploadedImage.Success = "File could not be uploaded."
                End Try
            Else
                uploadedImage.Success = "Cannot accept files of this type."
            End If
            uploadedImage.UploadedURL = fileUpload.FileName
        Else
            uploadedImage.UploadedURL = ""
            uploadedImage.Success = "No File to upload."
        End If
    Catch ex As Exception
        uploadedImage.UploadedURL = ""
        uploadedImage.Success = "Could not upload file"
    End Try

    Return uploadedImage

End Function


Ниже приведена моя функция в Javascript:

function ChooseFileFunction() {

        var fileToUpload = document.getElementById('<%= FileUpload1.ClientID %>');

        $.ajax({
            type: 'POST',
            url: 'MyWebService.asmx/UploadImages',
            data: JSON.stringify({ fileUpload : fileToUpload }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) { alert("success"); }
        });

    } 


В asp.net:

<div class="ChooseFile_Div"><asp:FileUpload ID="FileUpload1" CssClass="ChooseFile_FileUpload" runat="server" /></div>
<br/>
<asp:Button ID="Button1" OnClientClick="ChooseFileFunction();return false;" runat="server" Text="Upload" />


Что я уже пробовал:

Я попробовал asp:AsyncPostBackTrigger с методом в коде позади, но возвращенное значение файла было ложным

F-ES Sitecore

Вы не можете загружать такие файлы через javascript, так как он не имеет доступа к файловой системе. Google "asp.net asynch file upload", и вы найдете различные варианты того, как это сделать.

H.AL

не могли бы вы дать мне несколько ссылок?

1 Ответов

Рейтинг:
6

Richard Deeming

Если вы используете современный браузер[^], вы можете использовать то FormData класс[^] чтобы загрузить файл:

function ChooseFileFunction() {
    
    var fileToUpload = document.getElementById('<%= FileUpload1.ClientID %>');
    
    $.ajax({
        type: 'POST',
        url: 'MyWebService.asmx/UploadImages',
        data: new FormData(fileToUpload.form)
    }).done(function(){
        alert("success");
    }).fail(function(){
        alert("failed");
    });
}

Если вам нужно поддерживать старые браузеры, то вам нужно будет использовать скрытый <iframe>, и измените свою форму target чтобы указать на этот кадр. Кроме того, вы можете использовать один из многих доступных плагинов для загрузки файлов jQuery.

На стороне сервера вам нужно будет удалить этот параметр из вашего UploadImages метод, и прочитать файл из HttpContext.Current.Request.Files вместо.