Il y a beaucoup de questions à ce sujet sur le Web et plusieurs solutions sont proposées avec l'achat de composants.
Je propose ici la solution que j'ai mise en place et qui ne coute rien. Avec un progress bar, c'est un peu plus compliqué mais est-ce vraiment utile si vous affichez une image de loading ?
La partie HTML (XHTML)
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<Triggers>
<asp:PostBackTrigger ControlID="btnUploadImage" />
</Triggers>
<ContentTemplate>
<table>
<tr>
<td>
l'image : </td>
<td>
<asp:FileUpload ID="txtUploadImage" runat="server"/>
<img alt="uploading ..." id="imageloader" style="display:none;"src="loader.gif" />
</td>
</tr>
<tr>
<td>
</td>
<td>
<asp:Button ID="btnUploadImage" runat="server" onclick="btnUploadImage_Click"
OnClientClick="javascript:return ShowProgress();" Text="Enregistrer" />
</td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>
Ensuite la partie "C#"
protected void btnUploadImage_Click(object sender, EventArgs e)
{
if ((txtUploadImage.HasFile) && (txtUploadImage.PostedFile.FileName != null))
{
/// votre code
}
}
Le principe est simple, c'est un bête UpdatePanel mais en ajoutant le Triggers cela permet de ne plus avoir son FileUpload n'est plus null. Ajoutez ensuite le script javascript suivant, pour réaliser le loader :
<script type="text/javascript" language="javascript">
function ShowProgress() {
document.getElementById('imageloader').style.display = "block";
return true;
}
function StopProgress() {
document.getElementById('imageloader').style.display = "none";
return true;
}
</script>
Il y a moyen de faire plus chouette mais pour l'exemple, cela fonctionne très bien et c'est très très vite en place.