- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

Требования:

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

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

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


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

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

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

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

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

В функции 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" #Файл существует
    }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:ScriptsSend_URL.ps1" -NoLogo -NonInteractive -WindowStyle Hidden

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

# Удаляем все кроме 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:inetpubwwwrootindex.html C:inetpubwwwrootUPLOADindex.html -Force 

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

Автор: hlgroup

Источник [1]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/powershell/111312

Ссылки в тексте:

[1] Источник: https://habrahabr.ru/post/276575/