Jak ułatwić sobie wysyłanie plików do znajomych?
Saturday, January 28, 2012 3:05:10 AM
Istnieją co prawda serwisy pokroju typu RapidShare czy imageshack, ale nie dość, że trzeba odpalić przeglądarkę czy nową kartę, to jeszcze trzeba rozszyfrowywać literki /znaczki aby poprawnie przejść weryfikację, że nie jest się internetowym botem.
Do tego wpisu zainspirował mnie ten blog. O co chodzi? O skrypt, który zaloguje się za nas, wyśle plik, a do tego automatycznie da nam adres do schowka, który możemy wysłać rozmówcy czy to mailem, czy po prostu w komunikatorze, a wszystko to, bez uruchamiania przeglądarki.
Wykorzystać do tego celu możemy chyba każdy dowolny hosting stron www z dostępem przez FTP. Ja wykorzystuję UGU.
Zakładamy konto, mamy login, hasło, więc brakuje nam tylko skryptu który by automatyzował czynności.
Jako, iż nawyki konsoli pozostały mi z Debiana, zainteresowałem się powershellem, który jest zresztą automatycznie dostępny w Windows 7.
# Send.ps1 - wysyła podany plik na serwer FTP i zwraca jego adres HTTP
# Parametr: nazwa pliku lokalnego
param([string]$file = $(throw "File not specified"))
$filename = (New-Object IO.FileInfo @($file)).Name
# Stałe
$SERVER = "zulowski.ugu.pl" # to należy zmienić do swoich potrzeb
$FTP_LOGIN = "zulowski.ugu.pl" # to też
$FTP_PASS = "tu swoje hasło" # tu swoje hasło
$FTP_PATH = "/uploads/" # Ścieżka FTP do katalogu z uploadami
$HTTP_PATH = "/uploads/" # Ścieżka HTTP do tego samego katalogu
# Odczytujemy plik
$stream = New-Object IO.FileStream @($file, [IO.FileMode]::Open,
[IO.FileAccess]::Read, [IO.FileShare]::Read)
$content = New-Object byte[] @($stream.Length)
$stream.Read($content, 0, $content.Length) | Out-Null
$stream.Close()
# Uploadujemy na FTP
$url = "ftp://" + $SERVER + $FTP_PATH + $filename
$ftp = [Net.FtpWebRequest]::Create($url)
$ftp.Credentials = New-Object Net.NetworkCredential @($FTP_LOGIN, $FTP_PASS)
$ftp.Method = [Net.WebRequestMethods+Ftp]::UploadFile
$ftp.ContentLength = $content.Length
$req = $ftp.GetRequestStream()
$req.Write($content, 0, $content.Length)
$req.Close()
# Kopiujemy URL do schowka
"http://" + $SERVER + $HTTP_PATH + $filename | clip
Skrypt ten, w większości jest zapożyczony właśnie z tego blogu.
Dodatkowo tworzymy sobie plik wyślij_na_ugu.bat który wrzucamy do katalogu "sendto"
C:\Users\Grzegorz\AppData\Roaming\Microsoft\Windows\SendTo\
O takiej oto treści
powershell -Command . 'd:\scieżka_do_skryptu' '%1'
To rozwiązanie doda nam nową pozycję w menu kontekstowym (prawy przycisk na plik, wyślij do, wyślij_na_ugu).
Prawda, że ułatwia sprawę?
Oczywiście trzeba "pozwolić" Windowsowi na wykonywanie skryptów...
Idąc tym tokiem, stworzyłem trochę inne rozwiązanie, korzystając z narzędzi PuTTY, a dokładniej narzędzia psftp.exe i c# .
Posiadam dostęp do hostingu do którego dostęp mam tylko przez SSH/SFTP.
Program w c# do tego wygląda tak:
using System.Diagnostics;
using System.IO;
class Program
{
static void Main(string[] args)
{
if (args.Length < 1) System.Console.WriteLine("sposob uzycia:\n\tsftpUploader.exe nazwa_pliku");
else
uploader(args[0]);
System.Console.WriteLine("http:/server/~login/uploads/" + args[0] + "|clip");
}
/// <summary>
/// upload to sftp using putty/psftp
/// </summary>
static void uploader(string fileName)
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardInput = true;
startInfo.FileName = "psftp.exe";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = "LOGIN@SERVER";
try
{
// Start the process with the info we specified.
// Call WaitForExit and then the using statement will close.
using (Process exeProcess = Process.Start(startInfo))
{
StreamWriter sw = exeProcess.StandardInput;
sw.WriteLine("NASZE_HASŁO");
// sw.Flush();
System.Threading.Thread.Sleep(5000);
sw.WriteLine("cd www/uploads");
sw.WriteLine("put " + fileName);
sw.Flush();
sw.WriteLine("quit");
sw.Close();
exeProcess.WaitForExit();
}
}
catch
{
//eror
}
}
}
I wystarczy przeciągnąć plik na skrót tego programu, by go wysłać i dostać adres o przekazania














