Можно ли загрузить файл с компьютера клиента на сервер, который является внешним по отношению к веб-серверу, на котором размещена форма? - PullRequest
3 голосов
/ 23 января 2012

Для настройки сценария есть три машины: (1) компьютер клиента, (2) веб-сервер, (3) и сервер хранения файлов. Эти три машины не находятся в одной локальной сети и не находятся в одном домене. Веб-сервер работает под управлением Apache с PHP, а сервер хранения работает под управлением IIS7 с PHP.

У меня есть веб-страница, размещенная на веб-сервере, которая содержит модуль загрузки файлов. Когда пользователь загружает файл с этой веб-страницы, я хочу, чтобы файл хранился непосредственно на сервере хранения, а не на самом веб-сервере. Я хочу избежать передачи файла с веб-сервера на сервер хранения с помощью cURL или команды системного уровня, например «scp», потому что это кажется пустой тратой сетевых ресурсов и времени пользователя.

Возможно ли это сделать безопасно и каковы рекомендуемые реализации для этого?

Я нашел хороший многофайловый загрузчик на GitHub от blueimp , который может выполнять междоменных загрузок , но после следования инструкциям по настройке междоменных загрузок, Я получаю сообщение об ошибке от консоли отладки моего браузера:

XMLHttpRequest не может загрузить http://storageserver.com/scripts/process_uploads.php. Происхождение http://webserver.com не разрешено Access-Control-Allow-Origin.

Хотя я понимаю, что это не самый безопасный код, я добавил следующее в скрипт process_uploads.php для устранения неполадок:

header ('Access-Control-Allow-Origin: *');

Для пояснения, вот способ написания элемента формы, который анализируется плагином jQuery-File-Upload:

<form id="fileupload" action="http://storageserver.com:8080/scripts/process_uploads.php" method="POST" enctype="multipart/form-data">

Успешно ли кто-нибудь реализовывал междоменную загрузку файлов? Если да, можете ли вы пролить свет на то, что может быть надежным решением.

1 Ответ

1 голос
/ 23 января 2012

Я рекомендую вам приобрести машину времени и вернуться на несколько лет назад, когда Интернет стал более надежным местом, и браузеры не защищали от подобных вещей. В любом случае междоменные правила меняются каждые несколько месяцев. Было бы разумно, если бы можно было избежать этой банки с червями.

Я вижу два варианта, ни один из них не отличный. Есть, несомненно, больше.

Сначала: отправьте формы на ваш файловый сервер и отправьте формы на ваш веб-сервер.

Это зависит (в значительной степени, конечно) от надежного соединения между двумя серверами. Вы сказали, что не хотите копировать файлы с веб-сервера в файлер. Так что переместите ваши данные в другую сторону. Несколько байтов формы будут меньше попадания, чем копирование файлов в другом направлении. Итак, отправьте всю форму на ваш файловый сервер, и обработчик формы PHP отправит не файловые части (включая исходный IP-адрес и идентификатор сеанса) на веб-сервер. Вам даже не нужно хранить данные формы в файлере, просто отправьте результаты веб-сервера обратно в браузер. Не забывайте учитывать аутентификацию и безопасность при разработке.

Второе: используйте JavaScript или Flash для загрузки двух форм

Поместите содержимое не файловой формы в одну форму, а файл - в отдельную форму. Перехватите «Отправку одной формы», а также отправьте другую форму (на другой сервер). Это ПЛОХОЕ решение, потому что оно опирается на JavaScript в браузере, что не всегда есть. (Вы можете сломать свой сайт, потребовав его, но я не рекомендую его.) Поскольку вы уже используете jQuery, вы, вероятно, сможете найти решение самостоятельно.

Я не знаю, как бы вы сделали это во Flash, но я уверен, что это возможно. И я также уверен, что вы не должны делать это во Flash. Тьма на все закрытые "веб" технологии. Всегда используйте открытые инструменты.

Это все, что у меня есть. Но я сисадмин. Мне будет интересно посмотреть, что придут другие люди.

...