Невозможно получить полный путь к файлу, сброшенному в браузере из-за соображений безопасности. Что делать? - PullRequest
0 голосов
/ 27 января 2020

Я разрабатываю веб-приложение с Django, которое должно управлять и обрабатывать огромное количество пользовательских файлов в локальном int anet. Поскольку Django файлы приложения и пользовательские файлы будут размещаться в одной локальной сети, нет необходимости загружать файлы, можно предоставить Django полный сетевой путь к файлу через представление пользователя.

I понял, что невозможно получить полный путь к файлу из браузера из-за безопасности причин.

Существует много файлов, которые пользователь будет обрабатывать каждый день (около 150-200), поэтому не стоит просить пользователя вручную скопировать и вставить полный путь к файлу в приложение. Первоначальный подход к проектированию предполагал, что пользователь может перетаскивать файлы из Windows Explorer в выделенные области в браузере.

Какие у меня варианты, сообщество?

  1. переписать весь интерфейс как приложение Electron (yikes! Просто из-за этого! ) и использовать Django только в качестве бэкэнда REST API;
  2. переписать все как приложение для настольных компьютеров и потерять все преимущества, которые обеспечивает Django ( авторизация, аутентификация, ORM, панель администратора, gosh - много всего);
  3. третий забавный вариант

Я чувствую себя немного застрявшим. Нужен совет. Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Ну ...
Я решил свою проблему. С гораздо меньшим количеством крови, чем ожидалось, что я счастлив. :)

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

В шаблоне есть файл с именем main.js (или index.js, зависит от шаблон), который определяет окно приложения Electron и его содержимое. Внутри находится строка, которая загружает содержимое в объект Electron BrowserWindow:

mainWindow.loadFile(path.join(__dirname, 'index.html'));

К счастью, у объекта BrowserWindow есть метод loadURL, который можно использовать для загрузки веб-страницы вместо локального html файла:

mainWindow.loadURL('http://127.0.0.1:8000');

Это означает, что все страницы, отображаемые с помощью Django, будут отображаться в браузере Electron, который запускает node.js вместо стандартного механизма браузера javascript. Таким образом, этот код в шаблоне страницы Django будет отлично работать:

<h1 id="holder">DROP FILES HERE</h1>
<p id="dropped"></p>

<script>
    const dropZone = document.getElementById('holder');

    dropZone.addEventListener('drop', (e) => {
      e.preventDefault();
      e.stopPropagation();
      let filesList = '\n';
      for (const f of e.dataTransfer.files) filesList += f.path + '\n';
      document.getElementById('dropped').innerHTML = `Full file paths: ${filesList}`;
    });

    dropZone.addEventListener('dragover', (e) => {
      e.preventDefault();
      e.stopPropagation();
    });
</script>
0 голосов
/ 28 января 2020

Я столкнулся с той же проблемой при работе с this .

Когда я думаю о ваших возможностях

1 - Нет необходимости переписывать все приложение

  • Создание конечной точки API на стороне сервера
  • Создание сценария (программы) на клиенте, который будет sh реальных путей к серверу

    Ваши файлы должны быть доступны по сети

Вот код скрипта, который я использовал: Протестировано с python Python 3.7.4 Печатает реальный путь всех выбранных файлов в виде списка. source

import tkinter as tk
from tkinter import filedialog
import pathlib

root = tk.Tk()
root.withdraw()

root.attributes("-topmost", True)
file_path = filedialog.askopenfilenames()
# print(file_path) #debug
files = list(file_path)
print(files)

Затем вам нужно импортировать либо requests и сгенерировать запрос Json к конечной точке вашего сервера. Или просто вызвать curl с subprocess.

2- По вашему определению я предполагаю, что сеть intr anet является доверенной. Поэтому необходима аутентификация. И возникает вопрос о том, сколько пользователей будет использовать один и тот же файл после его обработки на сервере. тогда нет необходимости в django приложении.

...