Как стать автором
Обновить

Пересылка больших файлов. Автоматическое получение ссылки для скачивания на почту

Время на прочтение6 мин
Количество просмотров13K
Пользователям достаточно часто приходится заниматься пересылкой больших файлов как внутри локальной сети, так и за её пределы. К примеру, Пьеро нужно выслать Мальвине документацию объёмом 10 гигабайт. Тут на помощь не придет корпоративная почта, так как пользователи обычно не хотят заморачиваться с копированием ссылок и т.п. Если они в одной локальной сети, то поможет расшаренная папка, а если они на разных концах страны… Как правило, приходится пользоваться FTP-сервером, что зачастую не очень удобно, либо интернет-сервисами обмена большими файлами.

Так пришла идея создать удобный и контролируемый сервис для пересылки больших файлов в локальной сети.

Реализация на PowerShell, платформа Windows.

Требования:

  • Веб сервер опубликованный в интернет.
  • Расшаренная папка на компьютере под Windows (для определения владельца файла).
  • Настройка на сервере с шарой выполнения скрипта по расписанию, раз в минуту.

Как это работает:

  • Пользователь помещает ZIP архив в расшаренную папку на сервере.
  • Скрипт ищет ZIP-файлы в расшаренной папке и перемещает их в папку веб-сервера, затем отправляет письмо Владельцу файла.
  • Пользователю приходит письмо со ссылкой на скачивание файла через ваш веб-сервер.
  • Пользователь пересылает письмо со ссылкой на скачивание адресату.


Описание работы скрипта:

  • Удаление в целевой папке всего, что не имеет расширения ZIP.
  • Получение списка ZIP-файлов в целевой папке.
  • Перебор ZIP файлов с обработкой каждого файла функцией Send_URL.
  • Функция Send_URL: определяет Владельца файла, обрабатывает имя файла, перемещает файл под новым именем в папку веб-сервера, высылает Владельцу и Администратору (для контроля) на почту ссылку на скачивание файла, удаляет файлы в папке веб-сервера старше определенного количества дней. Более подробные комментарии смотрите в скрипте.
  • Создание файла в расшаренной папке с именем-подсказкой «только ZIP архив, остальное удаляется.txt».

Примечание: если пользователь входит в группу Администраторы на сервере с расшаренной папкой, то Владелец = группе Администраторы, для этого в скрипте указывается административный почтовый ящик.

В скрипте необходимо поменять следующие параметры на требуемые вам:

$path = "C:\UPLOAD\" #Расшареная папка на сервере
$path1 = "C:\inetpub\wwwroot\UPLOAD\" #Папка на веб-сервере, откуда скачивают

В функции Send_URL изменить параметры:

$day = -30 #Вы можете скачать файл в течении "+(-1*$day)+" дней. Затем файл будет удален с сервера.
$mail_domain = "@mydomain.com"
$owner_domain = "mydomain\\"
$mail_admin = "admin@mydomain.com"
$mail_server = "mail.mydomain.com"
$http = "http://web.mydomain.com/UPLOAD/"

Корректное определение владельца файла возможно только в домене. Без домена вам придется завести учетные записи пользователей на компьютере с расшаренной папкой и ассоциировать их с вашими пользователями.

Код:


#Файл Func.ps1 ###################################

# Смирнов Александр Николаевич hars@bk.ru декабрь 2015г.

Function Send_URL($File,$path,$path1){

	### Параметры которые необходимо поправить на свои
	##################################################
    $day = -30 #Вы можете скачать файл в течении "+(-1*$day)+" дней. Затем файл будет удален с сервера.
	$mail_domain = "@mydomain.com"
	$owner_domain = "mydomain\\"
	$mail_admin = "admin@mydomain.com"
	$mail_server = "mail.mydomain.com"
	$http = "http://web.mydomain.com/UPLOAD/"
	##################################################
	

    $File_nm = $File.Trim() # Удаление пробелов в начале и в конце в имени файла
	
    $File = $File -replace '\[|\]','`$0'	# Замена [] на корректные символы

    $owner = ( Get-Acl ($path + $File) ).Owner # Владелец файла
	
    ##############	Формирование email

    if( $owner -like "*dministrator*" -or !$owner ){
        $mail = $mail_admin
    }else{
        $mail = ($owner -ireplace($owner_domain,"")) + $mail_domain
    }

    ######################################

    #$md5 = Get-FileHash ($path + $File) -Algorithm MD5
    #$File_url = $md5.Hash + ".zip"
    #$File_new = $path1 + $md5.Hash + ".zip"

	############# Ограничение размера имени файла
    if($File_nm.length > 100){
        
        $File_url = $File_nm.Substring(0,100)
    }else{
        $File_url = $File_nm
    }
	#############################################
	
    ############# Замена символов @!{}%$#''&`
    $File_url = $File_url -ireplace("#","")
    $File_url = $File_url -ireplace("%","")
    $File_url = $File_url -ireplace("$","")
    $File_url = $File_url -ireplace("&","_")

    $File_url = $File_url -ireplace("{","(")
    $File_url = $File_url -ireplace("}",")")

    $File_url = $File_url -ireplace('`',"")
    $File_url = $File_url -ireplace('"',"")
    $File_url = $File_url -ireplace("'","")

    $File_url = $File_url -ireplace("~","")
    $File_url = $File_url -ireplace(" ","_")
	#########################################

	# Формирование имени файла для публикации в веб
    $File_url = $mail + "_" + $File_url

	# Путь перемещаемого файла	
    $File_new = $path1 + $File_url
	
    # Перемещение файла в веб-папку
    Move-Item -path ( $path + $File ) -destination $File_new -force -EA SilentlyContinue #-whatif 

	# Проверка перемещения файла на случай если он ещё копируется пользователем в папку
    if( Get-ChildItem $File_new -EA SilentlyContinue){
        write-host "OK" #Файл существует

        #установка новой метки времени создания файла, 
        #чтобы скрипт отвечающий за очистку папки от старых файлов,
        #не удалил созданный давным давно, но пересылаемый сейчас или время от времени архив
        $F = Get-ChildItem $File_new 
        $F.LastWriteTime = Get-date

    }else{
        write-host "NO" #Файл не сущетсвует
        break # прерывание функции
    }

	# Размер файла
    $colItems = (Get-ChildItem $File_new | Measure-Object -property length -sum)
    $colSize = "{0:N2}" -f ($colItems.sum / 1MB) + " Mb"

    ######################################
	#Сообщение пользователю
    $Body = "<b>Скачать: </b><a href='" + $http + $File_url +"'>" + $File_nm + " (" + $colSize + ")</a><br/>
    Вы можете скачать файл в течении "+(-1*$day)+" дней. Затем файл будет удален с сервера."

	#Отправка письма
    Send-MailMessage -to $mail -from $mail_admin -subject "Пересылка файлов" -BodyAsHtml $Body -Encoding UTF8 -SmtpServer $mail_server
    
	#Отправка письма администратору, для контроля	
    if($mail -inotlike $mail_admin){
        Send-MailMessage -to $mail_admin -from $mail -subject "Пересылка файлов" -BodyAsHtml $Body -Encoding UTF8 -SmtpServer $mail_server
    }

    Write-Host $owner $mail $Body # Проверка в консоли что кому отправляем

    ######################################
	#Проверка устаревания файлов в веб-папке и их удаление по мере устаревания
    get-childitem $path1 *.zip  | where {$_.lastwritetime -le (get-date).adddays($day) } | del -Recurse -Force
}
##########################################################################################
##########################################################################################
##########################################################################################
##########################################################################################
##########################################################################################




#Файл Send_URL.ps1 ###################################

# Смирнов Александр Николаевич hars@bk.ru  декабрь 2015г.

#В расписание добавить исполнение скрипта раз в минуту
# powershell.exe "C:\Scripts\Send_URL.ps1" -NoLogo -NonInteractive -WindowStyle Hidden

<#
."C:\scripts\Func.ps1" # Подгружаем файл с функциями. Лучше подгружать функции(процедуры), так красивее.
#>
### Параметры которые необходимо поправить на свои
##################################################
$path = "C:\UPLOAD\" #Расшареная папка на сервере
$path1 = "C:\inetpub\wwwroot\UPLOAD\" #Папка на веб-сервере, откуда скачивают
##################################################

# Удаляем все кроме ZIP файлов
Get-ChildItem $path -Recurse -Exclude *.zip | %{ Remove-Item $_ -Force -Recurse } 

# Получаю имена файлов в папке
$flist = get-childitem $path"*.zip" #-recurse 

# Перебор ZIP файлов, перемещение и отсылка владельцу файла письма со ссылкой
$flist | ForEach-Object{ Send_URL $_.PSChildName $path $path1 } 

# Заново копируем html перенаправляющий на сайт 
#В файле index.html строчка перенаправления, для "невозможности" просмотра папки в браузере
#<html><head><meta http-equiv="refresh" content="0;url=http://www.yandex.ru" /></head></html>
#copy C:\inetpub\wwwroot\index.html C:\inetpub\wwwroot\UPLOAD\index.html -Force 

# Создание файла с именем-подсказкой, для особо одаренных
New-Item $path"только ZIP архив, остальное удаляется.txt" -type file -Force 

###################################
###################################
###################################

#Файл DeleteOldFiles.ps1 ###################################
#Удаление старых файлов. Удаление файлов старше ХХ дней.
# Смирнов Александр Николаевич hars@bk.ru  декабрь 2015г.

#В расписание добавить исполнение скрипта раз в день
# powershell.exe "C:\Scripts\DeleteOldFiles.ps1" -NoLogo -NonInteractive -WindowStyle Hidden

### Параметры которые необходимо поправить на свои
##################################################
$ClearFolder = "C:\inetpub\wwwroot\UPLOAD\" #Папка которую вы чистите
$day = -14 #Время устаревания файла в днях со знаком минус
##################################################

#Функция oldDel перебирает все файлы в папке и проверяет время их последнего изменения
#если время изменения меньше или равно текущая дата минус 14 дней, то файл удаляется

function oldDel($folder,$day){
   get-childitem $folder *  | where {$_.lastwritetime -le (get-date).adddays($day) } | del -Recurse -Force #-WhatIf
}

oldDel $ClearFolder $day
Теги:
Хабы:
Всего голосов 15: ↑11 и ↓4+7
Комментарии12

Публикации

Истории

Ближайшие события