![]() |
Delphi. Отправка файла на гейт.
Вот друг попросил помочь с функций отправки файла на сервер. По-быстрому навоял функцию. Думаю что она будет полезна и другим людям.
Работает всё на WinAPI + WinSock. Можно отправлять файлы до 2 гигов (не напряжно на память). После отправки файла функция возвращает страницу которую выдал сервак (с учетом HTTP заголовка) Гейт представляет собой скрипт PHP код:
Код:
Код:
var |
можно пояснить как запихнуть код в делфи и последний код совсем не понятен. куда его пихать?
|
s := SendFile('localhost', '/1.php', 'c:\test.txt');
возвращет ответ. первый параметр - адрес сервера - host / ip второй - путь и имя скрипта на который посылается файл. третий - локальный файл который будет посылаться. Юзать как? - вставляй куда угодно и юзай. Всё расписано. |
вставил всю эту беду а делфи вот так-
Цитата:
Цитата:
|
код вставляется после implementation
учи Delphi или хотябы смотри как это она сама делает. |
Цитата:
может хоть окошко какое куда файл вставлять и кнопка send? я уже не говорю о прогрессбаре... |
автор ну чего молчишь?
|
Огромнейший респект!!!!!!!!!!!! Давно с этим вопросом мучались с дружбаном. Всё работает отлично.
|
>>> учи Delphi или хотябы смотри как это она сама делает. <<<
Этим всё сказано. Учить людей умножению я не собираюсь ) Зачем тебе лезть в это, если ты не знаеш самый элементарных вещей. |
вообщем спасибо Nightmarе помог наладить
|
по-хорошему вот так делать не айс
Код:
while true do |
господа помогите теперь сделать что бы не руками путь к загружаемому файлу писать а через опендиалог загружать и отправлять. сделал так-
Цитата:
|
Цитата:
|
пришла идея-
s := SendFile('localhost', '/1.php', 'тут переменная какаято'); procedure TForm1.Button2Click(Sender: TObject); begin if OpenDialog1.Execute then begin Listbox1.Items.Add(ExtractFileName(opendialog1.Fil eName)); тоже чтото надо дописать end; end; господа не стесняемся предлагаем решение может поможет кто? |
2 Hellsp@wn если бы да кабы. По хорошему нужно обрабатывать что разорвалась связь с серваком, а также что не удалось считать файл. итд итп. А друг юзверь вообще комп ребутнул. 4 кила полюбому уйдут в ядро, и send вернет это кол-во. другое дело, что не факт что они по сети передадутся.
хотя по хорошему достаточно просто подправить: Но всё равно это лишнее. Код:
|
уважаемые.
этот код предполагает наличие у того, кто его пытается понять хотя бы основ знаний языка - на уровне "Delphi для самых начинающих". Если вы вообще никогда не видели этого языка в глаза - не задавайте идиотских вопросов. |
Вы задаете какие то нюбийские вопросы. Если вы изучали Delphi, то должны понимать, как вызвать эту функцию. К тому же автор все детально описал.
Цитата:
Код:
while true doУже давно спросить хотел, так как сам занимаюсь этим... По моему самым правильным вариантом было бы начинать делать отправку файла вместе с заголовком, так как делают браузеры. К примеру: составил заголовок, который занимает 200 байт. Если мы решили отправлять по 4096 байт, то, соответственно, 4096-200=3896 байт считываем из файла, и заносим в массив. Это честно говоря не особо легко реализовать, особенно когда используем формат Content-Type: multipart/form-data, так как после отправки файла, мы должны отправить еще boundary. |
Давайте уж тогда пофилософствуем как отправить на сервер файл больше чем позволяют настройки php “upload_max_filesize» и «post_max_size».
Мой вариант, отправлять файл по кускам, например по 1 метру на один POST запрос, а дальше php скрипт всё это добро склеит. Ну к каждому POST запросу допустим можно указать части, типа 1 из 20 и т.д… Способ очень геморный и неудобный. Собственно, кто может что получше предложить? |
Цитата:
Цитата:
Но если нужно учитывать значения upload_max_filesize и post_max_size, тогда можно было бы: 1) Получить от сервака сессию, которою потом передавать снова назад на сервер в виде либо кукиса, либо как параметр POST запроса. 2) Отправлять файл как ты уже говорил, кусками по 1 Мб., при этом указывать номер части и свою сессию. Сессия нужна для того, чтобы сервак знал, в какой файл будем записывать полученные данные. То есть, когда сервак только генерирует сессию, он должен создать уникальный префикс для файла, (скажем file_name_777_). Потом передаем клиенту сессию. Когда клиент уже будет отправлять нам данные на сервер, он должен будет указывать свою сессию, а сервак в свою очередь будет создавать файлы вида file_name_777_номер_части_файла с соответствующем содержанием. Когда отослали все части, я бы сделал следующее: отослал бы дополнительный POST запрос на скрипт, в котором указывал бы сессию, и количество частей, которое я отправил. Сервер должен проверить, есть ли все части файла (то есть, существуют ли файлы file_name_777_1...file_name_777_N). Если существуют, - объединить всех в один файл, сами части удалить. Но это мой вариант, хочу выслушать ваши, если есть ограничения в upload_max_filesize и post_max_size. |
Цитата:
PHP код:
в своих клиентах я испольую вместо send и recv такие функции Код:
// отослать ВСЕ ... - правильная функция |
Цитата:
|
Всё работает. Респект!
|
мдауж
Код:
procedure TForm1.Button2Click(Sender: TObject); |
Цитата:
|
вот господа кое как с помощью вышеотписавшегося человека придал ей божеский вид. сделал кнопку загрузки файла и даже полосу (edit) ввода хоста. осталось прикрутить прогрессбар но это не в моих силах. кто может это сделать вот вам исходники
http://webfile.ru/4012376 |
ну неужели никто не поможет?
|
Цитата:
|
ну дык чего так никто и не поможет?
|
Цитата:
mobilka набери в поске - "delphi как прикрутить прогресс бар", а корректнее "delphi работа с прогресс баром" ну еще RTFM ) |
прикрутить прогрессбар несложно, берёшь гайку, отвёртки и прикручиваешь....
Если не можешь, обратись к сантехникам. |
Цитата:
|
mobilka, мда ппц... идешь в закладку win32 кидаешь на форму progress bar
у него есть параметры... min,max,position когда передавать файл собираешься смотришь размер файла и присваешь прогресс бару - ProgressBar1.max = размер файла... далее где у тебя цикл отправки файла (send там и тд...) пишешь ProgressBar1.postion = ProgressBar1.postion + количество отправленных байт (send возврщает скока байт было отправлено) RTFM!!! |
mobilka, Если ты не знаешь основ языка, куда тебе работа с сокетами и т.п.?
Вопросы такого уровня здесь не задают. |
блин. Сколько же я искал то кого метода:) Спасибо те, лови + - сы!
|
+1 ТС респект код хороший
Цитата:
|
| Время: 00:38 |