Improvements #10382 ยป WFileDropWidget-custom-upload.patch
| src/Wt/WFileDropWidget.C | ||
|---|---|---|
|
if (uploads_[i]->uploadId() == id) {
|
||
|
fileFound = true;
|
||
|
currentFileIdx_ = i;
|
||
|
auto currentFile = uploads_[currentFileIdx_].get();
|
||
|
resource_ = std::make_unique<WFileDropUploadResource>(this, currentFile);
|
||
|
resource_->dataReceived().connect(this, &WFileDropWidget::onData);
|
||
|
resource_->dataExceeded().connect(this, &WFileDropWidget::onDataExceeded);
|
||
|
resource_ = uploadResource();
|
||
|
doJavaScript(jsRef() + ".send('" + resource_->url() + "', "
|
||
|
+ (currentFile->filterEnabled() ? "true" : "false")
|
||
|
+ (uploads_[currentFileIdx_]->filterEnabled() ? "true" : "false")
|
||
|
+ ");");
|
||
|
uploadStart_.emit(currentFile);
|
||
|
uploadStart_.emit(uploads_[currentFileIdx_].get());
|
||
|
break;
|
||
|
} else {
|
||
|
// If a previous upload was not cancelled, it must have failed
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
std::unique_ptr<WResource> WFileDropWidget::uploadResource()
|
||
|
{
|
||
|
auto resource = std::make_unique<WFileDropUploadResource>(this, uploads_[currentFileIdx_].get());
|
||
|
resource->dataReceived().connect(this, &WFileDropWidget::onData);
|
||
|
resource->dataExceeded().connect(this, &WFileDropWidget::onDataExceeded);
|
||
|
return resource;
|
||
|
}
|
||
|
void WFileDropWidget::handleTooLarge(::uint64_t size)
|
||
|
{
|
||
|
if (currentFileIdx_ >= uploads_.size()) {
|
||
| src/Wt/WFileDropWidget.h | ||
|---|---|---|
|
*/
|
||
|
Signal<File*>& uploadFailed() { return uploadFailed_; }
|
||
|
class WFileDropUploadResource;
|
||
|
protected:
|
||
|
virtual std::string renderRemoveJs(bool recursive) override;
|
||
|
virtual void enableAjax() override;
|
||
|
virtual void updateDom(DomElement& element, bool all) override;
|
||
|
virtual std::unique_ptr<WResource> uploadResource();
|
||
|
virtual JSignal<int>& requestSend() { return requestSend_; };
|
||
|
std::unique_ptr<WResource> resource_;
|
||
|
friend class WFileDropUploadResource;
|
||
|
private:
|
||
|
void setup();
|
||
| ... | ... | |
|
bool incomingIdCheck(int id);
|
||
|
WMemoryResource *uploadWorkerResource_;
|
||
|
class WFileDropUploadResource;
|
||
|
std::unique_ptr<WFileDropUploadResource> resource_;
|
||
|
unsigned currentFileIdx_;
|
||
|
static const std::string WORKER_JS;
|
||
| ... | ... | |
|
std::bitset<5> updateFlags_;
|
||
|
bool updatesEnabled_; // track if this widget enabled updates.
|
||
|
friend class WFileDropUploadResource;
|
||
|
};
|
||
|
|
||
|
}
|
||
| src/js/WFileDropWidget.js | ||
|---|---|---|
|
return items || types;
|
||
|
};
|
||
|
this.validFileCheck = function(file, callback, url) {
|
||
|
this.validFileCheck = function(upload, callback, url) {
|
||
|
var reader = new FileReader();
|
||
|
reader.onload = function() {
|
||
|
callback(true, url);
|
||
|
callback(true, url, upload, APP);
|
||
|
}
|
||
|
reader.onerror = function() {
|
||
|
callback(false, url);
|
||
|
callback(false, url, upload, APP);
|
||
|
}
|
||
|
reader.readAsText(file.slice(0, 32)); // try reading some bytes
|
||
|
reader.readAsText(upload.file.slice(0, 32)); // try reading some bytes
|
||
|
}
|
||
|
dropwidget.setAcceptDrops = function(enable) {
|
||
| ... | ... | |
|
bodyDragEnter = function(e) {
|
||
|
if (!(dropIndication || bodyDropForward)
|
||
|
|| !$(dropwidget).is(":visible"))
|
||
|
|| !$(dropwidget).is(":visible")
|
||
|
|| !acceptDrops)
|
||
|
return;
|
||
|
|
||
|
dragState = 1;
|
||
| ... | ... | |
|
}
|
||
|
|
||
|
sending = true;
|
||
|
APP.emit(dropwidget, 'requestsend', uploads[0].id);
|
||
|
dropwidget.emitRequestSend(APP, uploads[0]);
|
||
|
}
|
||
|
dropwidget.emitRequestSend = function(APP, upload) {
|
||
|
APP.emit(dropwidget, 'requestsend', upload.id);
|
||
|
}
|
||
|
|
||
|
dropwidget.send = function(url, useFilter) {
|
||
| ... | ... | |
|
self.uploadFinished(null);
|
||
|
return;
|
||
|
} else {
|
||
|
var sendFn = (uploadWorker != undefined && useFilter) ?
|
||
|
self.workerSend : self.actualSend;
|
||
|
self.validFileCheck(upload.file, sendFn, url);
|
||
|
self.validFileCheck(upload, dropwidget.getSendFn(), url);
|
||
|
}
|
||
|
}
|
||
|
this.actualSend = function(isValid, url) {
|
||
|
dropwidget.getSendFn = function() {
|
||
|
return (uploadWorker != undefined && useFilter) ? self.workerSend : self.actualSend;
|
||
|
}
|
||
|
this.actualSend = function(isValid, url, upload, APP) {
|
||
|
if (!isValid) {
|
||
|
self.uploadFinished(null);
|
||
|
return;
|
||
| ... | ... | |
|
xhr.send(fd);
|
||
|
}
|
||
|
this.workerSend = function(isValid, url) {
|
||
|
this.workerSend = function(isValid, url, upload, APP) {
|
||
|
if (!isValid) {
|
||
|
self.uploadFinished(null);
|
||
|
return;
|
||