2016-11-06 3 views
1

У меня есть сайт с формой для загрузки файлов. Я хочу автоматически входить в систему и загружать файлы изображений, когда изменения меняются в моей локальной папке на моем компьютере. Могут ли быть предоставлены какие-либо указания по этому вопросу.Автоматический загрузчик файлов на сайт

+0

Возможно, вам придется написать собственное приложение, так как такая функциональность будет представлять угрозу безопасности и, скорее всего, не будет поддерживаться обычными браузерами. – mike510a

+0

Не могли бы вы рассказать? Я немного новичок в вещах. Какой подход будет работать? –

+0

Сайт для локальных файлов на вашем компьютере не совпадает с вашим сайтом, и для предотвращения XSS (межсайтовый скриптинг) единственным способом отправки файла на веб-сайт является выбор пользователем файла , Theres не может опросить локальный диск машины с веб-сайта или из javascript, чтобы определить, изменился ли файл (по крайней мере, не то, что я знаю) – mike510a

ответ

0

В соответствии с моим пониманием вы можете написать задачу для этой цели, которая может запускаться, позволяет говорить каждый час и проверять, внесены ли какие-либо изменения в каталог, а затем загрузить эти файлы в ваше приложение.

+0

Любые детали о том, как я мог написать? –

+0

Да, конечно, посмотрите на «Sidekiq gem». – rubhan

+0

Вы можете начать здесь [ссылка] (https://github.com/mperham/sidekiq) – rubhan

0

Я не знаю, на какой системе вы работаете, но вы можете сделать что-то подобное. Если вы находитесь в системе linux, вы можете использовать команду watch для отслеживания активности выбранного каталога. То, что вы можете сделать, это использовать что-то вроде Mechanize в рубиновом скрипте, который запускается командой watch, которая затем отправляется и отправляет форму и выгружает файл для вас, выбирая файл с последней датой создания.

0

Я понимаю, что он говорит, рубин на рельсах в пост, но этот ответ является столь же законно, как писать решение в Ruby (и немного легче/быстрее)

Использование Qt C++, чтобы сделать это, то вам могли бы сделать что-то вроде этого:

(непроверенные, вам придется внести коррективы для вашей конкретной ситуации)

Обзор кодекса:

  • Создайте программу, которая закругляется на Ti mer каждые 20 минут и проходит через весь каталог, который вы указываете с помощью WATCH_DIR, и если он находит файлы в этом каталоге, которые были изменены в промежутке времени, в течение которого последний цикл выполнялся (или после запуска программы, но до запуска первого цикла), то он загружает, что точный файл в любой URL вы задаете с UPLOAD_URL

затем создайте файл с именем AutoUploader.pro и файл с именем main.cpp


AutoUploader.pro

QT += core network 
QT -= gui 

CONFIG += c++11 

TARGET = AutoUploader 
CONFIG += console 
CONFIG -= app_bundle 

TEMPLATE = app 

SOURCES += main.cpp 


main.cpp

#include <QtCore/QCoreApplication> 
#include <QtCore/qglobal.h> 
#include <QDir> 
#include <QDirIterator> 
#include <QNetworkAccessManager> 
#include <QTimer> 
#include <QByteArray> 
#include <QHash> 

#define WATCH_DIR "/home/lenny/images" 
#define UPLOAD_URL "http://127.0.0.1/upload.php" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    MainLoop loop(WATCH_DIR); 
    return a.exec(); 
} 

class MainLoop : public QObject { 
    Q_OBJECT 
public: 
    MainLoop(QString _watch_directory = qApp->applicationDirPath()) { 
     watch_directory = _watch_directory; 


     // the ACTION="" part of the upload form 
     website_upload_url = UPLOAD_URL; 

     /* 20 minutes 
     20 * 60 * 1000 = num of milliseconds that makes up 
     20 mins =  1200000 ms */ 
     QTimer::singleShot(1200000, this, SLOT(check_for_updates())); 

     /* this will stop any file modified before you ran this program from 
     being uploaded so it wont upload all of the files at runtime */ 
     program_start_time = QDateTime::currentDateTime(); 
    } 


    QDateTime program_start_time; 
    QString watch_directory; 
    QString website_upload_url; 

    // hash table to store all of the last modified times for each file 
    QHash<QString, QDateTime> last_modified_time; 
    ~MainLoop() { qApp->exit(); } 

public slots: 
    void check_for_updates() { 
     QDirIterator it(QDir(watch_directory)); 

     /* loop through all file in directory */ 
     while (it.hasNext()) { 
      QFileInfo info(it.next()); 

      /* check to see if the files modified time is ahead of 
       program_start_time */ 
      if (info.lastModified.msecsTo(program_start_time) < 1) { 
       upload_file(info.absoluteFilePath()); 
      } 
     } 
     /* set program_start_time to the current time to catch stuff next 
      time around and then start a timer to repeat this command in 
      20 minutes */ 
     program_start_time = QDateTime::currentDateTime(); 
     QTimer::singleShot(1200000, this, SLOT(check_for_updates())); 
    } 


    /* upload file code came from 
     https://forum.qt.io/topic/11086/solved-qnetworkaccessmanager-uploading-files/2 
    */ 

    void upload_file(QString filename) { 
     QNetworkAccessManager *am = new QNetworkAccessManager(this); 
     QString path(filename); 

     // defined with UPLOAD_URL 
     QNetworkRequest request(QUrl(website_upload_url)); 

     QString bound="margin"; //name of the boundary 
     //according to rfc 1867 we need to put this string here: 
     QByteArray data(QString("--" + bound + "\r\n").toAscii()); 
     data.append("Content-Disposition: form-data; name=\"action\"\r\n\r\n"); 
     data.append("upload.php\r\n"); 
     data.append("--" + bound + "\r\n"); //according to rfc 1867 
     data.append(QString("Content-Disposition: form-data; name=\"uploaded\"; filename=\"%1\"\r\n").arg(QFileInfo(filename).fileName()));  
     data.append(QString("Content-Type: image/%1\r\n\r\n").arg(QFileInfo(filename).suffix())); //data type 
     QFile file(path); 
     if (!file.open(QIODevice::ReadOnly)) 
      return; 
     data.append(file.readAll()); //let's read the file 
     data.append("\r\n"); 
     data.append("--" + bound + "--\r\n"); 
     request.setRawHeader(QString("Content-Type").toAscii(),QString("multipart/form-data; boundary=" + bound).toAscii()); 
     request.setRawHeader(QString("Content-Length").toAscii(), QString::number(data.length()).toAscii()); 
     this->reply = am->post(request,data); 

     connect(this->reply, SIGNAL(finished()), this, SLOT(replyFinished())); 
    } 

    void replyFinished() { 
     /* perform some code here whenever a download finishes */ 
    } 

}; 

Перед запуском программы убедитесь, что прочитать его полностью и внести необходимые изменения, читая комментарии и пост - также вам, возможно, придется установить фрейм qt в зависимости от вашей платформы

В любом случае, последний шаг - запустить qmake, чтобы создать файл проекта и, наконец, make, чтобы построить двоичный файл.

Очевидно, что последние шаги различаются в зависимости от используемой вами системы.

... Эта программа будет продолжать работать ... по существу навсегда, пока вы не закроете его .... загрузку измененные файлы каждые 20 минут

Надеются, что это помогает ...

Смежные вопросы