Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Upload automatico e dinamico

    Salve a tutti,

    la mia esigenza è quella di caricare sul server una serie di file presenti in una cartella del mio disco fisso.
    L'elenco di questi files è presente in una tabella di un DB access.

    Dispongo già di uno script asp che mi permette di fare l'upload dei file sul server, il problema è che tale upload avviene tramite selezione "manuale" del file da un form mentre io vorrei che questo avvenisse automaticamente per tutti i files all'interno di una tabella.

    Il form da cui manualmente seleziono il file è il seguente:

    codice:
    <form method="POST" enctype="multipart/form-data" action="uploadfoto.asp">
              <p align="center"><font color="#000080" size="2" face="Arial">
    
              File: </font><input type="file" name="blob" size=30>
    
              <input type="submit" name="Enter" value="Aggiungi">
          </form>
    Da come ho capito il file uploadfoto.asp richiamato dal formnon fa altro che acquisire le informazioni passate dal form (nella variabile "blob") elaborarle ed effettuare l'upload sul server:
    codice:
    <%
    'variabili di configurazione
    Dim folder
    folder = "\public\foto"				'directory sul server con accesso in scrittura
    'fine variabili di configurazione
    
    Response.Expires=0
    Response.Buffer = TRUE
    Response.Clear
    
    Sub BuildUploadRequest(RequestBin)
    PosBeg = 1
    PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
    boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg) 
    boundaryPos = InstrB(1,RequestBin,boundary)
    Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
    Dim UploadControl
    Set UploadControl = CreateObject("Scripting.Dictionary")
    'Get an object name
    Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
    Pos = InstrB(Pos,RequestBin,getByteString("name="))
    PosBeg = Pos+6
    PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
    Name = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
    PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
    PosBound = InstrB(PosEnd,RequestBin,boundary)
    If  PosFile<>0 AND (PosFile<PosBound) Then
    PosBeg = PosFile + 10
    PosEnd =  InstrB(PosBeg,RequestBin,getByteString(chr(34)))
    FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
    UploadControl.Add "FileName", FileName
    Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
    PosBeg = Pos+14
    PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
    ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
    UploadControl.Add "ContentType",ContentType
    PosBeg = PosEnd+4
    PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
    Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
    Else
    Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
    PosBeg = Pos+4
    PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
    Value = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
    End If
    UploadControl.Add "Value" , Value	
    UploadRequest.Add name, UploadControl	
    BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
    Loop
    End Sub
    Function getByteString(StringStr)
    For i = 1 to Len(StringStr)
    char = Mid(StringStr,i,1)
    getByteString = getByteString & chrB(AscB(char))
    Next
    End Function
    Function getString(StringBin)
     getString =""
     For intCount = 1 to LenB(StringBin)
    	getString = getString & chr(AscB(MidB(StringBin,intCount,1))) 
     Next
    End Function
    
    byteCount = Request.TotalBytes
    
    RequestBin = Request.BinaryRead(byteCount)
    Dim UploadRequest
    Set UploadRequest = CreateObject("Scripting.Dictionary")
    
    BuildUploadRequest  RequestBin
    
    contentType = UploadRequest.Item("blob").Item("ContentType")
    filepathname = UploadRequest.Item("blob").Item("FileName")
    filename = Right(filepathname,Len(filepathname)-InstrRev(filepathname,"\"))
    value = UploadRequest.Item("blob").Item("Value")
    
    'Create FileSytemObject Component
    Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject")
    
    'Create and Write to a File
    Set MyFile = ScriptObject.CreateTextFile(Server.mappath(folder)&"\"&filename)
     
    For i = 1 to LenB(value)
    	MyFile.Write chr(AscB(MidB(value,i,1)))
    Next
     
    MyFile.Close
    %>
    Ho provato a bypassare il form lanciando direttamente la riga uploadfoto.asp?blob=c:\sito\foto\foto1.jpg
    ma ricevo l'errore:
    Microsoft VBScript runtime error '800a0005'

    Invalid procedure call or argument: 'MidB'

    /public/uploadfoto.asp, line 17 (quella in BOLD)


    Premesso che grazie all'interrogazione del DB dispongo gia' dei diversi percorsi dei file da caricare, come posso fare a sfruttare questo script in modo automatico e dinamico facendogli caricare tramite un ciclo tutti i file sul server?

    Grazie a tutti in anticipo.
    Jotto

  2. #2
    Utente di HTML.it L'avatar di Umanista
    Registrato dal
    Jan 2002
    Messaggi
    1,022
    Questo articolo ti sarà sicuramente utile
    http://support.microsoft.com/kb/q276488/

    Ciao

  3. #3
    Ho letto l'articolo ma ha poco a che vedere con la mia esigenza
    ... mi sono spiegato male sicuramente.
    Ci riprovo. Io dispongo di:

    1. una tabella in access contenente i percorsi dei files (residenti sul mio disco fisso) che voglio inviare sul server
    2. un form da cui prelevo il percorso del file da caricare
    3. uno script per fare l'upload dei file

    Cio' che vorrei che accadesse è questo:
    a. apre il database e seleziona dalla tabella interessata la lista dei percorsi dei file da caricare
    b. prende il primo record di questa selezione
    c. mette il suo contenuto (es. c:\sito\foto\img1.jpg) dentro una variabile
    c. la elabora estraendone solo il nome del file (img1.jpg) e
    d. fa l'upload del file al server.
    e. sposta il cursore sul prossimo record
    f. riparte dal passo c

    In questo momento i passi a, b e c sono eseguiti da un form su un file che chiamiamo select.asp, mentre le fasi e ed f sono eseguite dallo script di upload.
    Tutto il problema sta nel modificare opportunamente select.asp affinchè tramite un ciclo passi automaticamente uno alla vota i vari parcorsi dei file da caricare allo script di upload.

    Qualche "illuminato" sa aiutarmi?
    Grazie a tutti in anticipo.
    Jotto

  4. #4
    Moderatore di ASP e MS Server L'avatar di Roby_72
    Registrato dal
    Aug 2001
    Messaggi
    19,559
    Di regole gli input type file non sono personalizzabili.
    Con qualche tecnica lato client puoi provare a fare qualcosa ma con ASP di sicuro nulla.

    Roby

  5. #5
    Utente di HTML.it L'avatar di Baol74
    Registrato dal
    Jul 2002
    Messaggi
    2,004
    Puoi farlo in diversi modi, l'unica limitazione a tutto questo è che per consentire ad una pagina web di prendere un file in locale, devi dare il permesso allo script/applet client di entrare nel tuo hd.

    Detto questo, mi devi dire in quale contesto girerà questa cosa.
    Mi spiego. Se questa funzionalità dovrà girare su sistemi microsoft, sarà molto più semplice leggere i files. Se girera' sia su microsoft che sul linux, dovrai fare un'applet java con la certificazione.

    Impotiziamo la prima. Solo su sistemi microsoft.

    Dovrai lavorare in javascript (serebbe meglio in vbscript per problemi con le conversioni binarie). Fai il tuo array con la lista dei files, creai un oggetto per la lettura (posibilmente adodb.stream). Crei la richiesta di upload nel formato mulipart/form-data e d invi i dati al server con l'oggetto Microsoft.XMLHTTP ad una pagina che esegue l'upload.

    Se quello che ho appena scritto è un lingua sconosciuta o quasi, non vorrei scoraggiarti, ma non sarà una cosa facile.

    Nei prossimi giorni se vuoi ti posterò degli articoli sulla costruzione della richiesta, e sull'invio dei dai in post con xmlhttp.

    Se devi fare un'applet, allora sarà sicuramente più semplice data la maggiore disponibilità di oggetti, naturalmente, certificazione esclusa.

    C'è un'altra possibilità che è l'uso di xml al posto di multipart/form-data come formato o la creazione di un tuo formato specifico.

    Ciao

  6. #6
    Grazie a tutti per le risposte intanto.

    Baol74 ti sarei grato se volessi passarmi gli articoli di cui dici in ogni caso il server gira sotto windows cosi' come la macchina del client che dovra' caricare i files.

    ci aggiorniamo e grazie ancora.
    Jotto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.