Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

HTTP: Problema com upload de multiplos arquivos

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Duvida HTTP: Problema com upload de multiplos arquivos

    Olá,

    Estou precisando fazer um upload de vários arquivos para o servidor via Delphi, formulario html e PHP, mas só chega 1 arquivo lá, antes vem um Access Violation, mas ainda chega 1. Siceramente não sei ao certo se o problema está no código Delphi ou no php que peguei como referência.

    Segue abaixo o meu código Delphi que estou utilizando =>

    Código:
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdMultipartFormData, IdBaseComponent, IdComponent,
      IdTCPConnection, IdTCPClient, IdHTTP;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        IdHTTP1: TIdHTTP;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure Http_arquivos;
     
    var
     
    i: integer;
    arquivos: array [0..6] of String;
    HTTP: TIdHTTP;
    POSTData: TIdMultipartFormDataStream;
     
    begin
     
    arquivos[0]:= 'c:\arquivo0.bmp';
    arquivos[1]:= 'c:\arquivo1.html';
    arquivos[2]:= 'c:\arquivo2.html';
    arquivos[3]:= 'c:\aarquiv3.jpg';
    arquivos[4]:= 'c:\arquivo4.wav';
    arquivos[5]:= 'c:\arquivo5.bmp';
    arquivos[6]:= 'c:\arquivo6.txt';
     
      HTTP := TIdHTTP.Create(nil);
      POSTData := TIdMultipartFormDataStream.Create;
     
      for i:= 0 to Length(arquivos) do
        begin
     
          if fileexists (arquivos[i]) then  begin
          //showmessage(arquivo[i]);
     
           try
        POSTData.AddFile('userfile[]', arquivos[i], 'multipart/form-data');
     
        HTTP.Post('http://localhost/ENVIO/up.php', POSTData);
     
         finally
        POSTData.Free;
     
        end;
    end;
    end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Http_arquivos;
    end;
     
    end.
    e este é o script php de referência que mencionei acima =>

    Código:
    $updir = 'upload';      // Directory for uploads
    $max_size = 500;            // Sets maxim size allowed for the uploaded files, in kilobytes
     
    // sets an array with the file types allowed
    $allowtype = array('bmp', 'gif', 'htm', 'html', 'jpg', 'jpeg', 'mp3', 'pdf', 'png', 'rar', 'zip', 'txt', 'wav');
     
    // if the folder for upload (defined in $updir) doesn't exist, tries to create it (with CHMOD 0777)
    if (!is_dir($updir)) mkdir($updir, 0777);
     
    /** Loading the files on server **/
     
    $result = array();          // Array to store the results and errors
     
    // if receive a valid file from server
    if (isset ($_FILES['userfile'])) {
      // checks the files received for upload
      for($f=0; $f<count($_FILES['userfile']['name']); $f++) {
        $fup = $_FILES['userfile']['name'][$f];       // gets the name of the file
     
        // checks to not be an empty field (the name of the file to have more then 1 character)
        if(strlen($fup)>1) {
          // checks if the file has the extension type allowed
          $type = end(explode('.', strtolower($fup)));
          if (in_array($type, $allowtype)) {
            // checks if the file has the size allowed
            if ($_FILES['userfile']['size'][$f]<=$max_size*1000) {
              // If there are no errors in the copying process
              if ($_FILES['userfile']['error'][$f]==0) {
                // Sets the path and the name for the file to be uploaded
                $thefile = $updir . '/' . $fup;
                // If the file cannot be uploaded, it returns error message
                if (!move_uploaded_file ($_FILES['userfile']['tmp_name'][$f], $thefile)) {
                  $result[$f] = ' The file could not be copied, try again';
                }
                else {
                  // store the name of the uploaded file
                  $result[$f] = '<b>'.$fup.'</b> - OK';
                }
              }
            }
            else { $result[$f] = 'The file <b>'. $fup. '</b> exceeds the maximum allowed size of <i>'. $max_size. 'KB</i>'; }
          }
          else { $result[$f] = 'File type extension <b>.'. $type. '</b> is not allowed'; }
        }
      }
     
       // Return the result
      $result2 = implode('<br /> ', $result);
      echo '<h4>Files uploaded:</h4> '.$result2;
    }
    o html de referência usado pra montar o form html no Delphi =>

    Código:
    <form id="uploadform" action="uploader.php" method="post"
    enctype="multipart/form-data" target="uploadframe" onsubmit="uploading(this); return false">
      <input type="file" class="file_up" name="userfile[]" />
      <input type="submit" value="UPLOAD" id="sub" />
    </form>
    Agradeço demais por todas as sugestões que enviarem

  • Font Size
    #2
    Acredito que pode ter algo errado nessa parte:

    Código:
    POSTData.AddFile('userfile[]', arquivos[i], 'multipart/form-data');
    o que é esse userfile[] ?

    Tenta tirar o []

    Comment


    • Font Size
      #3
      Postado Originalmente por C0d3r_Burn Ver Post
      Acredito que pode ter algo errado nessa parte:

      Código:
      POSTData.AddFile('userfile[]', arquivos[i], 'multipart/form-data');
      o que é esse userfile[] ?

      Tenta tirar o []
      Isso aí segundo um form html indica que é pra múltiplos arquivos, ja tentei retirar, mas não resolveu

      Comment


      • Font Size
        #4
        Pelo que entendi:

        Código:
           POSTData.AddFile('userfile[]', arquivos[i], 'multipart/form-data'); // essa parte adiciona o(s) arquivo(s). ao POSTData.
         
            HTTP.Post('http://localhost/ENVIO/up.php', POSTData); // essa parte posta o(s) arquivo(s) adicionados em POSTData
        Se o objetivo é adicionar vários arquivos no mesmo Form não entendi porque ele usa o HTTP.Post a cada loop do
        Código:
          for i:= 0 to Length(arquivos)
        Acredito que nesse caso o loop do for teria que terminar antes do HTTP.Post.

        Primeiro você adiciona todos os arquivos em POSTData. Depois chama o HTTP.Post uma vez só enviando o POSTData com todos os arquivos.

        Testa aee

        Comment


        • Font Size
          #5
          Não sei absolutamente nada de delphi, mas seu problema é bem evidente.
          No loop você está desalocando a variavel POSTData (com o Free), por isso só enviou um arquivo e depois deu access violation (tentou acessar um recurso já desalocado).
          Fora isso, a chamada ao método POST de HTTP deve ocorrer depois do loop senão será enviado um arquivo por requisição -em oposição aos 7 de uma vez- e pode nem funcionar.

          Comment


          • Font Size
            #6
            Postado Originalmente por singur Ver Post
            Não sei absolutamente nada de delphi, mas seu problema é bem evidente.
            No loop você está desalocando a variavel POSTData (com o Free), por isso só enviou um arquivo e depois deu access violation (tentou acessar um recurso já desalocado).
            Fora isso, a chamada ao método POST de HTTP deve ocorrer depois do loop senão será enviado um arquivo por requisição -em oposição aos 7 de uma vez- e pode nem funcionar.

            Ae, problema resolvido, vcs tinham razão! obrigado msm.

            Comment

            X
            Working...
            X