Invio di un file da un pc client ad un server web

di il
14 risposte

Invio di un file da un pc client ad un server web

Gentili tutti!

Un nuovo problema mi assale, forse per inesperienza o forse mi mancano maggiori nozioni: sto scrivendo un codice per eseguire upload di files dal pc client al server web. Il linguaggio e' ASP.NET in ambiente Microsoft VWD Express e code-behind VB.NET.

Premessa: il programma gira su un server web, l'utente si collega dal suo pc client con indirizzo "http://www.et..."; attraverso la tool di selezione del file FileUpload [in ASP] o input file [in HTML] l'utente ricerca nel suo pc (quindi client) il file da uploadare; infine attraverso l'evento click di un Button esegue l'upload.

Il problema: il tool di selezione del file non rileva il path completo del file sul pc client, pertanto il programma genera l'eccezione 'File o Path not found', perchè il file viene ricercato sul server e non sul client.

Come fare?
Qui sotto il codice ASP. La parte HTML l'ho presa da un vecchio sito che mi proponeva una soluzione, ma ancora non funge.

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default2.aspx.vb" Inherits="Default2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt">

<html xmlns="http://www.w3.org/1999/xhtm">

<head>
<title>Upload di un file</title>
</head>

<body>
<form id="form1" runat="server">
<br />
<br />
<br />
<center>
<table border="0" bgcolor="#ccFDDEE">
<tr align="center">
<td colspan="2" align="center">
<b>Upload di un file</b>
</td>
</tr>
<tr>
<td colspan="2" align="center">

</td>
</tr>
<tr>
<td>
<b>Scegli il file da inviare:</b>
</td>
<td>
<input name="file" type="file" />
</td>
</tr>
<tr>
<td colspan="2" align="center">

</td>
</tr>
<tr>
<td colspan="2" align="center">
<asp:Button ID="Button1" runat="server" Text="Upload" />
</td>
</tr>
</table>
</center>

</form>
</body>
</html>

Questo che segue è il code-behind che viene generato sull'evento click del Button di upload con il quale ottengo il nome del file ma senza il path, e comunque anche se ottenessi il path il programma lo cercherebbe sul server web, nel quale e' ospite. Cosa sbaglio o cosa mi manca di sapere?...

Partial Class Default2
Inherits System.Web.UI.Page

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim nomeFile As String = Request.Form("file")
End Sub
End Class

14 Risposte

  • Re: Invio di un file da un pc client ad un server web

    Ciao, quella roba non ha troppo senso.
    Ti consiglio una soluzione veloce e funzionale per l'upload, tipo questa:
    http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/AjaxFileUpload/AjaxFileUpload.aspx
  • Re: Invio di un file da un pc client ad un server web

    Grazie Toki! sempre pronto e competente nelle risposte.

    Ho scaricato la tool Ajax, ma devo dirti che non sono riuscito.
    Però, ti dico la verità, vorrei provare a spiegarmi meglio e ti prego di ripartire da qui. Ti posto sotto anche il code-behind completo VB.NET che sto usando e che funziona benissimo (in locale...) e che viene scatenato alla pressione del pulsante Button.

    Funziona benissimo IN LOCALE perchè IO HO nel mio pc il file c:\mytest.bmp.

    Allora, quale è il problema??? Che quando il programma gira sul sito web, quindi lato server, la var-stringa 'aaa' è riferita al 'c:\' del server in cui sta il sito, ovviamente!!! e lì il file non esiste!

    Cosa occorre quindi??? Occorre quindi che io metta nel programma un controllo che funzioni lato client (tipo FileUpload) e che rilevi il percorso completo in cui è posizionato il file SUL PC CLIENT, in modo che io possa pescare esattamente il file dal path in cui esso è posizionato e assegnare la stringa alla variabile 'aaa' e così finalmente trasferirlo sul server web.

    MA FileUpload NON RILEVA IL PERCORSO COMPLETO del file del client e la var. 'aaa' rimane orfana del path in cui il file è posizionato ed il mio programma per upload files non funge. Non so come fare...

    Ecco il code-behind VB:

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim aaa As String = "c:\mytest.bmp" ' TOKI, OCCHIO A QUESTA STRINGA
    'setta la richiesta
    Dim fileToUpload As String = aaa
    Dim clsRequest As System.Net.FtpWebRequest = DirectCast(System.Net.WebRequest.Create ("ftp://ftp.xxxxx.xx/yyyyyyy/upload/mytest.bm"), System.Net.FtpWebRequest)
    clsRequest.Credentials = New System.Net.NetworkCredential("xxxxxx", "xxxxxx")
    clsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile

    'legge il file
    Dim bFile() As Byte = System.IO.File.ReadAllBytes((aaa))

    'upload del file...
    Dim clsStream As System.IO.Stream = clsRequest.GetRequestStream()
    clsStream.Write(bFile, 0, bFile.Length)
    clsStream.Close()
    clsStream.Dispose()
    End Sub
  • Re: Invio di un file da un pc client ad un server web

    Ciao,
    riproviamo senza ajax, magari più avanti quando avraì acquisito maggiori conoscenze lo comprenderai meglio.

    Supponiamo che tu abbia nella parte "HTML" il controllo:
    <asp:FileUpload ID="myFileUpload" runat="server" />
    per salvarlo lato server implementi la procedura:
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    Dim filePath As String = Request.PhysicalApplicationPath + "\cartella_upload\" 
    If (myFileUpload.HasFile) Then
        filePath = filePath + Server.HtmlEncode(myFileUpload.FileName)
        myFileUpload.SaveAs(filePath)
        'qui dai un messaggio di conferma salvataggio
    Else
        'qui dai un messaggio di errore
    End If
    End Sub
    Quello che ti ho postato è un salvataggio base (perdonami eventuali errori di sintassi, non l'ho provato).
    Una volta che sarai riuscito a eseguire l'upload e salvataggio, puoi arricchire la procedura di controlli sugli errori, ecc.

    Fammi sapere se è tutto chiaro.

    Ciao
  • Re: Invio di un file da un pc client ad un server web

    Ciao Toki, grazie per la risposta.

    Ma non funziona. La tua soluzione e' orientata al 'salvataggio' del file rilevato, ma io non ho problemi in questo, mi riesce benissimo. Il mio problema e' che myFileUpload.FileName e' orfano della vera path in cui esso risiede. Quindi quando alla riga 'myFileUpload.SaveAs(filePath)' si vuol salvare il file dal pc client verso il server web, lo sta cercando sul server non sul pc client!
    Infatti 'filePath', quando in locale faccio i miei tests, mi va in errore perche' contiene:
    'C:\Documents and Settings\user\Documenti\Visual Studio 2008\WebSites\WebSite9\upload\mytest.bmp' , infatti non e' vero, io il file l'ho rilevato da C:\mytest.bmp!

    Ma si può sapere come hanno fatto quelli di Google a fare la funzione di upload di files su Google drive? oppure quelli di Facebook a fare la funzione di upload delle foto? tutti aprono la tool di ricerca del file e tu puoi andare a scegliere il file piu' remoto nella cartella piu' remota del tuo hard disk e da li' viene correttamente pescato e uploadato.
    Se osservi bene il codice del post, ci sono quasi riuscito, mi manca solo poter rilevare dal pc client il giusto percorso del file, questo e' il grosso problema. Poi, una volta che ce l'ho, riesco bene a fare l'upload.

    Come fare?
  • Re: Invio di un file da un pc client ad un server web

    Ciao sei fuori pista.
    In una situazione normale il tuo pc è una cosa e il server un'altra. Sono macchine separate non codividono lo stesso hard disk, ecc.
    Quanto dal pc invii il file al server (upload), dentro myFileUpload.FileName hai il nome del file.
    Con myFileUpload.SaveAs(filePath) salvi il file su una cartella apposita del server. Il trasferimento è concluso.

    Cosa c'è che non ti torna?
  • Re: Invio di un file da un pc client ad un server web

    Toki, forse io non mi ero spiegato bene e la differenza fra il mio pc e il server web la conosco bene.
    O la differenza fra un pc cliente che utilizza un sito (che si collega quindi ad un server web) e che quindi si tratta di cose ben separate. A volte e' difficile mettere in parole quello che si ha in mente ma ero convinto di essere stato molto chiaro.

    Infatti avevi capito bene ed il codice che mi hai postato era giusto, fra l'altro e' anche suggerito da Microsoft nella guida all'uso di FileUpload. L'ho usato e funziona bene. Avevo 2 problemi:

    - Permessi in scrittura lato server sul mio spazio web
    - Errore sulla riga Dim filePath As String = Request.PhysicalApplicationPath + "esempio\upload\" (la stringa fra virgolette era sbagliata e il programma non trovava la cartella invocata)

    Risolto!

    Grazie per la collaborazione.
  • Re: Invio di un file da un pc client ad un server web

    L'importante è che hai risolto
  • Re: Invio di un file da un pc client ad un server web

    Ciao Toki.

    Tuttavia ho voluto mettere i controlli Ajax perche' mi sembrano piu' carini ed evoluti rispetto a quelli ASP.NET Framework, funziona tutto bene in locale ma quando copio il sito sul web e lo lancio dal browser mi da errore su questa riga:

    <%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="asp" %>

    se la tolgo (ed ovviamente tolgo anche tutti i controlli Ajax...) allora nessun errore ed il sito viaggia tranquillo.

    Se puo' essere utile ti dico anche che la cartella bin che contiene le dll ajax e' presente in locale ed anche sul web nella stessa identica posizione.

    Cosa ci trovi di strano? ti sembra che abbia dimenticato qualcosa?

    Grazie in anticipo.
  • Re: Invio di un file da un pc client ad un server web

    Ciao innanzitutto ti consiglio di modificare il tagprefix in modo da differenziarlo dai controlli standard.
    Usalo quindi cos'ì:
    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
    poi, hai inserito lo scriptmanager?
    <cc1:ToolkitScriptManager runat="server"  EnableScriptGlobalization="true"  EnableScriptLocalization="true"  CombineScripts="false">
    </cc1:ToolkitScriptManager>
    Per quanto riguarda l'errore cosa dice di preciso?
  • Re: Invio di un file da un pc client ad un server web

    D'accordo sul tagprefix.

    si', avevo messo lo scipt manager, anche con il tuo funziona bene. ma una volta che sposto il tutto sul sito non va: HTTP Error 404 - File or directory not found. La mia sensazione e' che una volta sul sito non trova la .dll, ma c'e'. (non riesco ad aggiungere il jpg dello screen shot qui nel messaggio, altrimenti ti avrei mostrato le cartelle del sito)

    Ecco il codice:

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt">

    <html xmlns="http://www.w3.org/1999/xhtm">
    <head runat="server">
    <title>Pagina senza titolo</title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" EnableScriptGlobalization="true" EnableScriptLocalization="true" CombineScripts="false">
    </cc1:ToolkitScriptManager>
    <br />
    </div>

    <div>
    <cc1:AsyncFileUpload id="AsyncFileUpload1" runat="server" />
    <br />
    <asp:Button ID="Button2" runat="server" Text="Invia" Width="106px" style="height: 26px" />
    </div>
    </form>
    </body>
    </html>
  • Re: Invio di un file da un pc client ad un server web

    Ciao non riesci ad aggiungere lo screenshot perchè usi il tasto risposta rapida, dovresti usare il rispondi standard che ha l'editor completo. Cmq mi sa che a breve disattiverò la funzione rapida perchè non è intuitivo che ci siano 2 editor diversi.

    Venendo al tuo problema:
    Il codice che hai postato ad occhio è corretto, non è che nella cartella bin hai il file ajax control toolkit refresh, giusto?
  • Re: Invio di un file da un pc client ad un server web

    Ciao Toki.

    No, uso risposta standard (sì in effetti toglierei la risp rapida...), forse sono io che uso male lo strumento:

    faccio cosi':
    [img]c:\xx.bmp[/img]

    Il file refresh c'era e l'ho tolto dal sito, ma non e' cambiato nulla.
  • Re: Invio di un file da un pc client ad un server web

    Ciao devi usare "invia allegato" in fondo all'editor. Quello che hai provato a fare funziona per risorse già presenti online su IProgrammatori.it o altro sito web.

    Il refresh hai fatto benissimo a toglierlo.
    Se in locale ti funziona c'è qualche differenza col server.
    La versione del framework del server, pc e controol toolkit è la stessa? e poi: web.config dell'applicazione e del server sono uguali? (ad eccezione ovviamente di stringhe di connessione e parametri vari).
  • Re: Invio di un file da un pc client ad un server web

    Grazie Toki!

    D'accordo, lavorero' in quella direzione: web.config, ver framework ecc...
Devi accedere o registrarti per scrivere nel forum
14 risposte