Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FTP - заливка файла, (550) File unavailable 
:(
    Опции темы
CYBERDREAM
Дата 12.11.2007, 11:51 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



Доброго времени суток всем.
Имеется принтер у которого поднят FTP. При попытки получить поток "Stream strm = reqFTP.GetRequestStream();" выскакивает ошибка: 
The remote server returned an error: (550) File unavailable (e.g., file not found, no access)
Код следующий использую:
Код

private static void up(string login, string pass, string path)
        {
            FileInfo fileInf = new FileInfo(path);
           // string uri = null;
            FtpWebRequest reqFTP;
            
            //uri = "ftp://192.168.0.7/dest/d1prn/" + fileInf.Name;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://192.168.0.7/dest/d1prn/" + fileInf.Name));            //создаем файлик на серваке
            reqFTP.Credentials = new NetworkCredential(login, pass);
            reqFTP.KeepAlive = false;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;

            reqFTP.Proxy = null;
            reqFTP.UseBinary = true;
            reqFTP.UsePassive = false;
            
            reqFTP.ContentLength = fileInf.Length;
            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen;

            FileStream fs = fileInf.OpenRead();
            try
            {
                Stream strm = reqFTP.GetRequestStream();   //Ошибка
                contentLen = fs.Read(buff, 0, buffLength);
                while (contentLen != 0)
                {
                    strm.Write(buff, 0, contentLen);
                    contentLen = fs.Read(buff, 0, buffLength);
                }

                strm.Close();
                fs.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("____>>>>"+ex.ToString());
            }
        }



Здесь http://www.rsdn.ru/Forum/?mid=2227639 пишут, что нужно разрешить CWD на стороне сервака, но в опциях принтера такого нету. Как быть народ? 
P.S. через тотал и ком строку все пашет нормально

Это сообщение отредактировал(а) CYBERDREAM - 12.11.2007, 11:52


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
tol05
Дата 12.11.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 6
Всего: 170



посмотри тут
смысл в том, чтобы послать команду "CWD" серверу вручную.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
CYBERDREAM
Дата 12.11.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



За ссылочку спасибо. 
Логинится без проблем. ПОменять директорию тоже. Но вот команду "PASV" не понимает и из командной строки тоже. Качал как то фтп клиент написанный на шарпе, та же беда. Но по идее пасивный режим не нужен, ибо мог прочитать все каталоге только в такой комбинации
Код

            reqFTP.UseBinary = true;
            reqFTP.UsePassive = false;



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
CYBERDREAM
Дата 13.11.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



Вышеописанным макаром пока что не получилось осилить ФТП. Он работает в активном режиме, и комманду PASV не понимает. При наличии времени все таки надо осилить через этот класс, красивое решение. А на данный момент решил проблему с помощью библиотечки editFTP, в одной из тем по ФТП ее предлагали, но тогда я не увидел что можно менять ConnectionMode на ACTIVE. 

Спасибо tol05 за ссылочку.  smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
0000
Дата 14.11.2007, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 1
Всего: 5



CYBERDREAM, а почему не через сокеты делаешь??
имхо лучше на уровне пониже - там можно явно послать байты...и никаких проблем не будет - сервер явно все поймет..
PM MAIL ICQ   Вверх
CYBERDREAM
Дата 14.11.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



0000 я только за, но увы не смог еще.
Меня как раз этот вариант идеально устраивает. Проблема в том, что сервер работает не в пассивном, а в активном режиме. Но ни команду ACTIVE ни PASV он не понимает, в этом то и загвоздка на данный момент.  Через ком. строку эти команды так же воспринимаются как непонятные. smile 
Думаю эту проблему решить можно, но пока еще не знаю как


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
0000
Дата 14.11.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 1
Всего: 5



через сокеты имхо проще, потому что лишних операций нет - подсоединился, послал запрос, обработал полученный ответ...все..чистая клиент-сервер...

reqFTP.UsePassive = true;

http://msdn2.microsoft.com/en-us/library/s...usepassive.aspx

помимо этого есть UseBinary, если понадобится бинарные файлы кидать

http://msdn2.microsoft.com/en-us/library/s....usebinary.aspx



кстати вот еще 2 интересные статейки про пассивный режим работы FTP и сравнение его с активным....
http://slacksite.com/other/ftp.html#passive
http://www.ncftp.com/ncftpd/doc/misc/ftp_a...PASVNATProblems

Это сообщение отредактировал(а) 0000 - 14.11.2007, 10:40
PM MAIL ICQ   Вверх
CYBERDREAM
Дата 14.11.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



В первом посте я указывал бинарный и активный режим. ПРоблема была в том, что он дирректорию не находил, как выяснилось это из-за того, что нужно слать команду CWD. В случае с сокетами именно так и выходит, но как правильно послать команду режима работы не пойму. Может специфика фтп сервака... Еще ньюанс пишу под фрэйм 1.1 на данный момент.

Добавлено через 5 минут и 44 секунды
Ну а сокеты конечно рулят  smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
0000
Дата 14.11.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 1
Всего: 5



так не понял..ты PASV включить не можешь на сервере или ему директорию сменить?
PM MAIL ICQ   Вверх
CYBERDREAM
Дата 14.11.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



Неуверен, что PASV можно включить на серваке, думаю в принтере все забито без возможностей изменений. 
Сменить директорию чему?


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
0000
Дата 14.11.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 1
Всего: 5



Код

class Program
    {
        static void Main(string[] args)
        {
            up("user", "user", "1.txt");
        }
        private static void up(string login, string pass, string path)
        {
            FileInfo fileInf = new FileInfo(path);
            
            FtpWebRequest reqFTP;
                        
            reqFTP = (FtpWebRequest)FtpWebRequest.Create("ftp://192.168.1.10/1.txt");            //создаем файлик на серваке
            
            reqFTP.Credentials = new NetworkCredential(login, pass);
            reqFTP.KeepAlive = false;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.Proxy = null;
            reqFTP.UsePassive = true;

            StreamReader sourceStream = new StreamReader(fileInf.Name);
            byte[] buff = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
            sourceStream.Close();
            if (fileInf.Length != buff.Length)
                throw new Exception();

            try
            {
                Stream strm = reqFTP.GetRequestStream(); 
                strm.Write(buff, 0, buff.Length);
                strm.Flush();
                strm.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("____>>>>" + ex.ToString());
            }

            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

            Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);

            response.Close();

            Console.ReadLine();
        }


вот тут с проксями и пассивным режимом можно еще поиграться....у меня и без них работает - на эмуляторе shhtps

Это сообщение отредактировал(а) 0000 - 14.11.2007, 11:13
PM MAIL ICQ   Вверх
CYBERDREAM
Дата 14.11.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



Увы та же история. Думаю это из-за жестких ограничений прав. 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
0000
Дата 14.11.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 1
Всего: 5



так...если не может вернуть поток, значит он может их не поддерживать..тут уже смотреть надо на сам сервер...а то может вообще зря пытаешься...

слушай..а ты хочешь, чтобы этот файл распечатался???..
по умолчанию файлы передаются в ASCII и не для печати..тебе надо явно тогда передать ему команду TYPE


если не поможет дай ему команду MODE S - посмотрим что вернет..эта команда переводит сервер в потоковый режим для передачи данных как поток байтов..

щас набросаю код с сокетами, проверим...

я просто не знаю как эти команды передать через FtpWebRequest

Это сообщение отредактировал(а) 0000 - 14.11.2007, 11:51
PM MAIL ICQ   Вверх
0000
Дата 14.11.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 1
Всего: 5



че-то коротенько не получилось, куча методов дополнительных вылезла по соединению и открыванию сокетов...
учти, что в этом примере я их нигде не закрывал - все убрал, так что надо будет - закроешь сам потом

Код

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    class Program
    {
        private static Socket CommandSocket;
        private static Socket DataSocket;
        private static byte[] ReceiveBuff = new byte[1024];
        private static byte[] SendBuff = new byte[1024];

        static void Main(string[] args)
        {
//            up("user", "user", "1.txt");
            Connect();
            UploadFile("1.txt");
            Console.ReadLine();
        }
        private static void OpenCommandSocket()
        {
            try
            {
                IPAddress hostadd = Dns.GetHostEntry("192.168.1.10").AddressList[0];
                IPEndPoint EPhost = new IPEndPoint(hostadd, 21);
                CommandSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                CommandSocket.Connect(EPhost);
            }
            catch (SocketException e)
            {
                Console.WriteLine(e.ErrorCode.ToString());
            }
        }
        private static void SendCommand(string command)
        {
            if (CommandSocket == null)
                OpenCommandSocket();
            byte[] sBuffer = Encoding.ASCII.GetBytes((command + "\r\n"));
            try
            {
                CommandSocket.Send(sBuffer, sBuffer.Length, SocketFlags.None);
                Console.WriteLine(command);
            }
            catch (SocketException ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        private static string ReceiveCommand()
        {
            string response = "";
            int bytes = 0;
            if (CommandSocket == null) OpenCommandSocket();            
            do
            {
                try
                {
                    bytes = CommandSocket.Receive(ReceiveBuff, ReceiveBuff.Length, SocketFlags.None);
                }
                catch (SocketException e)
                {
                    Console.WriteLine(e.ErrorCode);
                }
                response += Encoding.ASCII.GetString(ReceiveBuff, 0, bytes);
            }
            while (bytes > ReceiveBuff.Length);
            Console.WriteLine(Encoding.ASCII.GetString(ReceiveBuff, 0, bytes));
            return response;
        }
        private static bool ParseIPAdress(string IPString, out string ip, out int Port)
        {
            string ipData = null;
            string[] tmp = null;
            if ((IPString.IndexOf(',') != -1) && (IPString != null))
            {
                ipData = IPString.Substring(IPString.IndexOf('(') + 1, IPString.IndexOf(')') - IPString.IndexOf('(') - 1);
                ipData = ipData.Replace(',', '.');
                tmp = ipData.Split('.');
                ip = tmp[0] + "." + tmp[1] + "." + tmp[2] + "." + tmp[3];
                Port = int.Parse(tmp[4]) * 256 + int.Parse(tmp[5]);
                return true;
            }
            else
            {
                ip = "127.0.0.1";
                Port = 21;
                return false;
            }
        }
        private static void OpenDataSocket()
        {
            string ipAddress;
            int ipPort;
            SendCommand("PASV");
            string ans = ReceiveCommand();
            
            if (ParseIPAdress(ans, out ipAddress, out ipPort))
            {
                SendCommand("STRU F");
                int answer = Convert.ToInt16(ReceiveCommand().Substring(0, 3));
                if (answer == 200)
                {
                    SendCommand("TYPE A");
                    answer = Convert.ToInt16(ReceiveCommand().Substring(0, 3));
                    if (answer == 200)
                    {
                        try
                        {
                            DataSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                            IPEndPoint EPhost = new IPEndPoint(Dns.GetHostEntry(ipAddress).AddressList[0], ipPort);
                            DataSocket.Connect(EPhost);
                        }
                        catch (SocketException e)
                        {
                            Console.WriteLine(e.ErrorCode.ToString());
                        }
                    }
                }
            }
        }
        public static void UploadFile(string fileName)
        {
            FileStream inp = new FileStream(fileName, FileMode.Open);
            OpenDataSocket();

            SendCommand("STOR " + System.IO.Path.GetFileName(fileName));
            int answer = Convert.ToInt16(ReceiveCommand().Substring(0, 3));
            if (answer == 125 || answer == 150)
            {
                int bytes;
                while ((bytes = inp.Read(SendBuff, 0, (int)SendBuff.Length)) > 0)
                {
                    try
                    {
                        DataSocket.Send(SendBuff, bytes, SocketFlags.None);
                    }
                    catch (SocketException ex)
                    {
                        Console.WriteLine(ex.ErrorCode.ToString());
                    }
                }
             
            }
        }
        private static void Connect()
        {
            try
            {
                int answer = Convert.ToInt16(ReceiveCommand().Substring(0, 3));
                if (answer == 220)
                {
                    SendCommand("USER " + "user");
                    answer = Convert.ToInt16(ReceiveCommand().Substring(0, 3));
                    switch (answer)
                    {
                        case 230:
                            break;
                        case 331:
                            SendCommand("PASS " + "user");
                            answer = Convert.ToInt16(ReceiveCommand().Substring(0, 3));
                            break;
                        case 332:
                            goto case 331;
                    }
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine(e.ErrorCode.ToString());
            }
        }
        private static void up(string login, string pass, string path)
        {
            FileInfo fileInf = new FileInfo(path);
            
            FtpWebRequest reqFTP;
                        
            reqFTP = (FtpWebRequest)FtpWebRequest.Create("ftp://192.168.1.10/1.txt");            //создаем файлик на серваке
            
            reqFTP.Credentials = new NetworkCredential(login, pass);
            reqFTP.KeepAlive = false;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.Proxy = null;
            reqFTP.UsePassive = true;
            
            StreamReader sourceStream = new StreamReader(fileInf.Name);
            byte[] buff = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
            sourceStream.Close();
            if (fileInf.Length != buff.Length)
                throw new Exception();

            try
            {
                Stream strm = reqFTP.GetRequestStream();   //Ошибка
                strm.Write(buff, 0, buff.Length);
                strm.Flush();
                strm.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("____>>>>" + ex.ToString());
            }

            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

            Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);

            response.Close();

            Console.ReadLine();
        }

    }
}


PM MAIL ICQ   Вверх
CYBERDREAM
Дата 14.11.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



Мне именно в бинэри нужно передавать, иначе принтер не поймет, и использовать именно активный режим, а не пассивный. Указанный пример как то решает проблему с тем, чтобы разрешить пассивный режим? или это как пример просто?


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1198 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.