martes, 17 de octubre de 2023

ASP .Net WebForms - Enviar archivos a un web method

 Si, webforms todavía, como dicen en muchos blog, el codigo legacy todavía esta allí y debemos mantenerlo

Recientemente tenia la necesidad de enviar desde el front un archivo de Excel a un webmethod y no encontraba la forma, intente con varias vias pero no tuve exito, hasta que letendo y juntando ideas de stackoverflow y otras fuente encontre que la forma de hacerlo

Basicamente debes hacer lo siguiente

En el front convertir tu archivo a base64

En el back recibirlo como string y luego convertirlo a base64


Front


		async function LoadFile() {
            console.log("Entro aqui")
            var file = document.getElementById("file").files[0];

            let formData = new Object();
            formData.file = await ReadExcelToBase64(file);
            fetch('WebMethodsTest.aspx/TestLoadFile', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(formData),
            })
                .then(result => console.log(result.json()))
        }

        function ReadExcelToBase64(inputFile) {
            const temporaryFileReader = new FileReader();

            return new Promise((resolve, reject) => {
                temporaryFileReader.onerror = () => {
                    temporaryFileReader.abort();
                    reject(new DOMException("Problem parsing input file."));
                };

                temporaryFileReader.onload = () => {
                    resolve(temporaryFileReader.result.replace('data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,', ''));
                };
                temporaryFileReader.readAsDataURL(inputFile);
            });
        }
Back

	
	
	Public Shared Function TestLoadFile(file As String) As String
		Dim a As String
		a = "Hola"

		Dim fileBytes As Byte() = getArrayBytesFromStringFormatBase64(file)

		Return a
	End Function

	Public Shared Function getArrayBytesFromStringFormatBase64(stringFileFormatBase64 As String) As Byte()
		Dim bytes As Byte() = Convert.FromBase64String(stringFileFormatBase64)
		Return bytes
	End Function
Me ha parecido correcto tener este modelo de front con javascript y html y back con webmethods debido a que no tenemos mucho tiempo para reescribir la aplicación en otro lenguaje y con una arquitectura mas moderna, pero nos da un avance para cuando llegue el momento de hacer la migración; los webmethos simulan una api y dejar de usar los controles propios/clasicos de ASP.Net nos ayuda a usar los elementos nativos de html y hace mas facil una posible migración a un framework como react o angular