소스 검색

Fixing drag and drop file upload issue on windows (#19809)

Folder upload is not supported by most of the browsers and can cause
StreamVariable methods not fire on some configurations.
This fix tries to detect and prevent uploading of folders.

Change-Id: Ib6357ddaeda5549065ab8ef5f682f12ad5968bce
tags/7.7.0.beta1
adam 7 년 전
부모
커밋
ce746e0a86

+ 15
- 10
client/src/main/java/com/vaadin/client/ui/VDragAndDropWrapper.java 파일 보기

@@ -409,21 +409,26 @@ public class VDragAndDropWrapper extends VCustomComponent implements
}
}

int fileCount = event.getFileCount();
if (fileCount > 0) {
transferable.setData("filecount", fileCount);
for (int i = 0; i < fileCount; i++) {
final int eventFileCount = event.getFileCount();
int fileIndex = 0;
for (int i = 0; i < eventFileCount; i++) {
// Transfer only files and not folders
if (event.isFile(i)) {
final int fileId = filecounter++;
final VHtml5File file = event.getFile(i);
VConsole.log("Preparing to upload file " + file.getName()
+ " with id " + fileId);
transferable.setData("fi" + i, "" + fileId);
transferable.setData("fn" + i, file.getName());
transferable.setData("ft" + i, file.getType());
transferable.setData("fs" + i, file.getSize());
+ " with id " + fileId + ", size="
+ file.getSize());
transferable.setData("fi" + fileIndex, "" + fileId);
transferable.setData("fn" + fileIndex, file.getName());
transferable.setData("ft" + fileIndex, file.getType());
transferable.setData("fs" + fileIndex, file.getSize());
queueFilePost(fileId, file);
fileIndex++;
}

}
if (fileIndex > 0) {
transferable.setData("filecount", fileIndex);
}

VDragAndDropManager.get().endDrag();

+ 26
- 0
client/src/main/java/com/vaadin/client/ui/dd/VHtml5DragEvent.java 파일 보기

@@ -80,6 +80,32 @@ public class VHtml5DragEvent extends NativeEvent {
return this.dataTransfer.files[fileIndex];
}-*/;

/**
* Detects if dropped element is a file. <br>
* Always returns <code>true</code> on Safari even if the dropped element is
* a folder.
*/
public final native boolean isFile(int fileIndex)
/*-{
// Chrome >= v21 and Opera >= v?
if (this.dataTransfer.items) {
var item = this.dataTransfer.items[fileIndex];
if (item.webkitGetAsEntry) {
return item.webkitGetAsEntry().isFile;
}
}

// Zero sized files without a type are also likely to be folders
var file = this.dataTransfer.files[fileIndex];
if (file.size == 0 && !file.type) {
return false;
}

// TODO Make it detect folders on all browsers

return true;
}-*/;

public final native void setHtml5DataFlavor(String flavor, String data)
/*-{
this.dataTransfer.setData(flavor, data);

Loading…
취소
저장