upload pliku via html form

0

szukam, ślepnę już i nie mogę znaleźć jak można coś takiego zrobić:

na serwerze jest form

<form enctype="multipart/form-data" action="index.php?link=oferta.php" method="post"> Wskaż plik o nazwie "oferta.csv":
<input type="file" name="plik">
<input type="submit" name="wyslij" value=" Wyslij ">
</form>

oraz skrypt:

switch ($plik_name) {
case (""):
echo ("
Wybierz jaki? plik pacanie ...");
break;
case ("oferta.csv"):
define( "INCOMING", "oferta/");
copy($plik, INCOMING.$plik_name);
if(file_exists("$plik")){ unlink("$plik"); }
echo '
';
echo ("Nazwa pliku: " . $plik_name);
echo '
';
$plk=file("oferta/$plik_name");
$size=count($plk);
echo ("Ilo?ć pozycji w ofercie: " . $size);
echo '
';
include ("../inc/write.inc");
echo '
';
echo ("Nazwa bazy danych: " . $DB_NAME);
echo '
';
set_time_limit(90);
$del_produkty = mysql_query ("DELETE FROM produkty");
for ($_i=1; $_i<$size; $_i++){
unset($wpis);
$row = explode(";", $plk[$_i]);
if (($row[1]!='0')&&($row[4]>0)){
$mysql = "Insert into produkty (nr_gru,nr_ind,naz_mat,vat_stopa,stan_mat,cena_net,cena_bru,j_m,i_opk)
VALUES ('$row[0]','$row[1]','$row[2]','$row[3]','$row[4]', '$row[5]', '$row[6]', '$row[7]', '$row[8]')";
$result = mysql_query($mysql);
}
}
mysql_close($sql);
break;
default:
echo ("
Jakis lewy plik chcesz wysłać ...");
break;
}

no chodzi o to, żeby nie trzeba było włazić na stronkę i tam wysyłać pliku ale o to
aby można to zrobić z poziomu aplikacji,
niby są jakieś opisy obsługi idHTTP i post multiform data, ale nijak one nie chcą zadziałać.

Z góry dzięki za jakieś info w tej sprawie.

Pozdrawiam

0

jeśli znasz hasło na ftp to polecam komponent IdFTP.

0

znam hasło, fakt ftp jest proste, ale jak coś mi się nie udaje to mnie coś trafia, że nie mogę sobie z problemem poradzić

coż moze ktoś mi coś podpowie jeszcze, nayway dzięki za podpowiedź

0

no to jak cie coś trafia to masz:

var
  src: TIdMultiPartFormDataStream; //typ do którego dodajemy pliki które chcemy wysłać
begin
    src := TIdMultiPartFormDataStream.Create;
    src.AddFile(FIELD, NAZWA_PLIKU, 'multipart/form-data');//field - nazwa pola w formularzu na stornie www
    http.Post(url, src);//adres url np.  http://www.muj.com/test/index.php
    src.Free;

i to by tak wyglądało co do formularza to tak jak napisałeś:

<form enctype="multipart/form-data" action="index.php?link=oferta.php" method="post">
Wskaż plik o nazwie "oferta.csv":
<input type="file" name="plik">
<input type="submit" name="wyslij" value=" Wyslij ">
</form>

0

wydaje mi się, że już to probowałem i że plik do wysłania to musi być całe multipart/form-data bo plik csv to serwer nie wie co znim zrobic. jelsi jednak wiesz na 100%, że taki sposób zadziała, to proszę potwiedź, ter5az jestem w pracy i dopiero w domu będę mógł sprawdzić czy to zadziała, a znając siebie to znów pół dnia spędzę na nieudolnych próbach a i tak w końcu nic mi z tego nie wyjdzie.

Pozdrawiam.

0

wszystko działa na 100% :)

0

Poszedłem po linii najmniejszego oporu i dałem

procedure Twysylka.start;
begin
IdFTP1.Host:= Ehost.Text;
idftp1.Username:= Euser.Text;
idftp1.Password:= Epass.Text;
idftp1.Connect(True);
idftp1.Put('oferta.csv','/oferta/oferta.csv',false);
idftp1.Disconnect;
wysli;
end;

procedure Twysylka.wysli;
begin
wb.Navigate(Eadres.Text);
end;

gdzie wb to webbrowser

dzięki za wskazówki, ale chyba jestm zbyt cienki by kombinować bardziej zaawansowane opreracje

POzdrawiam

0

http://4programmers.net/faq.php?id=607

jeszcze dostosuj sobie skrypt, co nie jest już tematem na tym forum.

0

skrypt to nie problem
gorzej delphi zrobiłem tak:

procedure TForm1.Button1Click(Sender: TObject);
var
MultiPartFormDataStream: TIdMultiPartFormDataStream;
ResponseStream: TMemoryStream;
resp: TStringList;
begin
resp:= TStringList.Create;
MultiPartFormDataStream := TIdMultiPartFormDataStream.Create;
ResponseStream := TMemoryStream.Create;
try
Http.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFile('plik', 'c:\oferta.csv', 'multipart/form-data');
MultiPartFormDataStream.PrepareStreamForDispatch;
MultiPartFormDataStream.Position := 0;
HTTP.Post('http://toxic/oferta2.php', MultiPartFormDataStream, ResponseStream); // lokalny adres
MultiPartFormDataStream.SaveToFile('c:\b.txt');
memo1.Lines.AddStrings(http.Request.RawHeaders);
memo1.Lines.AddStrings(http.Request.CustomHeaders);
ResponseStream.SaveToFile('c:\a.txt');
finally
memo1.Lines.AddStrings(resp);
MultiPartFormDataStream.Free;
ResponseStream.Free;
end;
end;

a otrzymuję odpowiedź:

Warning unlink(): Permission denied in
c:\serwer\www\oferta2.php on line 5
Nazwa pliku:
Warning: file(oferta/): failed to open stream: Permission denied in
c:\serwer\www\oferta2.php on line 7
Ilo?ć pozycji w ofercie: 1 Aktualizacja oferty udana dnia 11.07.2004
Nazwa bazy danych: test

podczas gdy z formularza podanego wyzej jest OK

Program nic nie zapisuje ze streamu MultiPartFormDataStream
wnioskuję więc, że coś źle robię z tym streamem

samo juz nie wiem, znów pół soboty i poranek niedzielny zmarnowany.

Pozdrawiam

0
MultiPartFormDataStream.PrepareStreamForDispatch;
MultiPartFormDataStream.Position := 0;

a to po co? ja tego nie używałem i wszystko działało.

0

http://www.matlus.com/scripts/website.dll/Tutorials?DelphiTCPIP&IndyMultiPartFormData&5

link do tego helpa jest na stronach indy


zauważyłem, że zamiast zmiennych w formularzu prog przekazuje tylko jedno jakisc parametr [%s} i jeśli to jest pole do wartoc tego pola a jeśli plik to ten plik ale zawsze jest to ostatnia dodana pozycja do formularza czyli idmulti.. coś tam - stream

0

The most important point to remember is that once you've added the form fields, and files that you need, you must call the PrepareStreamForDispatch method before you send the stream.

z tego co rozumiem to robi się to w wypadku wysyłania plików i innych pól formularza. a ty wysyłasz inne??>

0

sugerujesz, że coś robię źle?

btw. próbowałem wcześniej wysyłać też bez tego ale nic to nie dało

The most important point to remember is that once you've added the form fields, and files that you need, you must call the PrepareStreamForDispatch method before you send the stream.

Najważniejszym punktem do zapamiętania jest to, że jeśłi dodałeś pola formularza oraz pliki które potrzebujesz, muslisz wywołać metodę PrepareStreamForDispatch zanim wyślesz swój stream

myślałem, że robię to dobrze, jeśli się mylę proszę o podpowiedź.

dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1