Implemented improvement #19695#note-4
This commit is contained in:
parent
2c4b91e835
commit
aec8ae3332
|
@ -209,6 +209,8 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
|
|||
|
||||
public static final int delayTime = 3000;
|
||||
|
||||
public static Map<String, List<String>> mapOfAllowedMimeTypesForPreview = null;
|
||||
|
||||
/**
|
||||
* Instantiates a new app controller explorer.
|
||||
*/
|
||||
|
@ -2130,7 +2132,7 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
|
|||
sub.loadFolder(loadFolderEvent.getTargetFolder());
|
||||
} else if (event instanceof GetInfoEvent) {
|
||||
GetInfoEvent getInfoEvent = (GetInfoEvent) event;
|
||||
sub.showDetails(getInfoEvent.getSourceFile());
|
||||
sub.showDetails(getInfoEvent.getSourceFile(), mapOfAllowedMimeTypesForPreview);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2326,6 +2328,7 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
|
|||
this.explorerPanel = new ExplorerPanel(true, true);
|
||||
loadMyLogin();
|
||||
loadMyFirstName();
|
||||
loadAllowedMimeTypesForPreview();
|
||||
return this.explorerPanel;
|
||||
}
|
||||
|
||||
|
@ -2347,9 +2350,12 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
|
|||
this.selectRootItem = selectRootItem;
|
||||
loadMyLogin();
|
||||
loadMyFirstName();
|
||||
loadAllowedMimeTypesForPreview();
|
||||
return this.explorerPanel;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Edi permissions.
|
||||
*
|
||||
|
@ -2634,6 +2640,22 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
|
|||
});
|
||||
}
|
||||
|
||||
private void loadAllowedMimeTypesForPreview() {
|
||||
|
||||
rpcWorkspaceService.getAllowedMimetypesForPreview(new AsyncCallback<Map<String,List<String>>>() {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Map<String, List<String>> result) {
|
||||
|
||||
mapOfAllowedMimeTypesForPreview = result;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Load my first name.
|
||||
*/
|
||||
|
|
|
@ -2,6 +2,7 @@ package org.gcube.portlets.user.workspace.client.interfaces;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.gcube.portlets.user.workspace.client.ConstantsExplorer.ViewSwitchType;
|
||||
import org.gcube.portlets.user.workspace.client.ConstantsExplorer.WS_UPLOAD_TYPE;
|
||||
|
@ -204,8 +205,9 @@ public interface SubscriberInterface {
|
|||
* Show details.
|
||||
*
|
||||
* @param fileModel the file model
|
||||
* @param mapAllowedMimeTypesForPreview the map allowed mime types for preview
|
||||
*/
|
||||
void showDetails(FileModel fileModel);
|
||||
void showDetails(FileModel fileModel, Map<String,List<String>> mapAllowedMimeTypesForPreview);
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -418,7 +418,7 @@ public interface Icons extends ClientBundle {
|
|||
@Source("icons/sync-icon-synched.png")
|
||||
ImageResource syncIconSynched();
|
||||
|
||||
@Source("icons/preview-not-available.png")
|
||||
@Source("icons/no-preview-available.png")
|
||||
ImageResource previewNotAvailable();
|
||||
|
||||
}
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 4.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
@ -688,4 +688,11 @@ public interface GWTWorkspaceService extends RemoteService {
|
|||
*/
|
||||
String updateDescriptionForItem(String itemId, String newDescription) throws Exception;
|
||||
|
||||
/**
|
||||
* Gets the allowed mimetypes for preview.
|
||||
*
|
||||
* @return the allowed mimetypes for preview
|
||||
*/
|
||||
Map<String, List<String>> getAllowedMimetypesForPreview();
|
||||
|
||||
}
|
||||
|
|
|
@ -623,4 +623,13 @@ public interface GWTWorkspaceServiceAsync {
|
|||
*/
|
||||
void updateDescriptionForItem(String itemId, String newDescription, AsyncCallback<String> callback);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Gets the allowed mimetypes for preview.
|
||||
*
|
||||
* @return the allowed mimetypes for preview
|
||||
*/
|
||||
void getAllowedMimetypesForPreview(AsyncCallback<Map<String, List<String>>> callback);
|
||||
|
||||
}
|
||||
|
|
|
@ -12,7 +12,6 @@ import org.gcube.portlets.user.workspace.client.event.FileDownloadEvent.Download
|
|||
import org.gcube.portlets.user.workspace.client.interfaces.GXTFolderItemTypeEnum;
|
||||
import org.gcube.portlets.user.workspace.client.model.FileGridModel;
|
||||
import org.gcube.portlets.user.workspace.client.model.FileModel;
|
||||
import org.gcube.portlets.user.workspace.client.resources.Icons;
|
||||
import org.gcube.portlets.user.workspace.client.resources.Resources;
|
||||
import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem;
|
||||
import org.gcube.portlets.user.workspace.client.workspace.folder.item.GWTExternalImage;
|
||||
|
@ -52,6 +51,7 @@ import com.google.gwt.user.client.ui.HorizontalPanel;
|
|||
import com.google.gwt.user.client.ui.Image;
|
||||
import com.google.gwt.user.client.ui.NamedFrame;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.google.gwt.user.server.Base64Utils;
|
||||
|
||||
// TODO: Auto-generated Javadoc
|
||||
/**
|
||||
|
@ -62,6 +62,8 @@ import com.google.gwt.user.client.ui.Widget;
|
|||
*/
|
||||
public class DialogGetInfoBootstrap extends Composite {
|
||||
|
||||
private static final int PREVIEW_WAITING_TIME = 10000;
|
||||
|
||||
private static DialogGetInfoBootstrapUiBinder uiBinder = GWT.create(DialogGetInfoBootstrapUiBinder.class);
|
||||
|
||||
/**
|
||||
|
@ -189,16 +191,24 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
|
||||
private Long fileSize = null;
|
||||
|
||||
private Map<String, List<String>> mapAllowedMimeTypesForPreview;
|
||||
|
||||
private Image spinnerImage = Resources.getIconLoading().createImage();
|
||||
|
||||
private Image noPreviewAvailable = new Image(Resources.getPreviewNotAvailable());
|
||||
|
||||
/**
|
||||
* Instantiates a new dialog get info bootstrap.
|
||||
*
|
||||
* @param fileModel the file model
|
||||
* @param onCloseCommand the on close command
|
||||
* @param mapAllowedMimeTypesForPreview the map allowed mime types for preview
|
||||
*/
|
||||
public DialogGetInfoBootstrap(final FileModel fileModel, final Command onCloseCommand) {
|
||||
public DialogGetInfoBootstrap(final FileModel fileModel, final Command onCloseCommand, Map<String,List<String>> mapAllowedMimeTypesForPreview) {
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
this.fileModel = fileModel;
|
||||
this.onCloseCommand = onCloseCommand;
|
||||
this.mapAllowedMimeTypesForPreview = mapAllowedMimeTypesForPreview;
|
||||
this.cgTxtMimeType.setVisible(true);
|
||||
|
||||
buttonClose.getElement().getStyle().setFloat(Float.RIGHT);
|
||||
|
@ -340,10 +350,15 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
|
||||
|
||||
// SOLUTION BASED ON GOOGLE DOC VIEWER
|
||||
if (typeEnum.equals(GXTFolderItemTypeEnum.EXTERNAL_PDF_FILE) ||
|
||||
if (typeEnum.equals(GXTFolderItemTypeEnum.EXTERNAL_PDF_FILE)
|
||||
|| typeEnum.equals(GXTFolderItemTypeEnum.PDF_DOCUMENT)
|
||||
|| typeEnum.equals(GXTFolderItemTypeEnum.EXTERNAL_FILE)
|
||||
|| typeEnum.equals(GXTFolderItemTypeEnum.GCUBE_ITEM)
|
||||
|| typeEnum.equals(GXTFolderItemTypeEnum.URL_DOCUMENT)
|
||||
|| typeEnum.equals(GXTFolderItemTypeEnum.METADATA)){
|
||||
|
||||
typeEnum.equals(GXTFolderItemTypeEnum.PDF_DOCUMENT)
|
||||
|| typeEnum.equals(GXTFolderItemTypeEnum.EXTERNAL_FILE)) {
|
||||
if(mapAllowedMimeTypesForPreview.containsKey(fileModel.getType())){
|
||||
GWT.log("Mime type "+fileModel.getType()+" allowed for preview, try to display it");
|
||||
|
||||
AppControllerExplorer.rpcWorkspaceService.getPublicLinkForFileItemId(fileModel.getIdentifier(), false,
|
||||
new AsyncCallback<PublicLink>() {
|
||||
|
@ -376,7 +391,7 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
+ URL.encode(result.getCompleteURL()) + "&embedded=true";
|
||||
|
||||
final HTML loadingPreviewHTML = new HTML();
|
||||
setPlaceholder(loadingPreviewHTML, "loading preview...");
|
||||
setPlaceholder(loadingPreviewHTML, true, "loading preview...");
|
||||
|
||||
final Frame frame = instanceFrame(googleDocViewerURL, loadingPreviewHTML);
|
||||
|
||||
|
@ -394,12 +409,12 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
}
|
||||
long checkTime = new Date().getTime();
|
||||
long diff = checkTime - startTime;
|
||||
if(diff>5000) {//is greater than 5 sec
|
||||
if(diff>PREVIEW_WAITING_TIME) {//is greater than 10 sec
|
||||
try {
|
||||
GWT.log("iFrameGoogleDocViewer not loaded within 5 sec, cancelling timer, removing iframe");
|
||||
cancel();
|
||||
removePlaceHolder(loadingPreviewHTML);
|
||||
htmlPanelFilePreview.add(new Image(Resources.getPreviewNotAvailable()));
|
||||
htmlPanelFilePreview.add(noPreviewAvailable);
|
||||
frame.setVisible(false);
|
||||
htmlPanelFilePreview.remove(frame);
|
||||
}catch (Exception e) {
|
||||
|
@ -416,35 +431,12 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//SOLUTION BASED ON PDFOBEJCT
|
||||
/*if(typeEnum.equals(GXTFolderItemTypeEnum.EXTERNAL_PDF_FILE) ||
|
||||
typeEnum.equals(GXTFolderItemTypeEnum.PDF_DOCUMENT)) {
|
||||
|
||||
GWT.log("The file is a PDF");
|
||||
|
||||
AppControllerExplorer.rpcWorkspaceService.getPublicLinkForFileItemId(fileModel.getIdentifier(), false, new AsyncCallback<PublicLink>() {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(PublicLink result) {
|
||||
|
||||
GWT.log("The PublicLink link is: "+result);
|
||||
|
||||
if(result!=null) {
|
||||
|
||||
String pdfPreview = "<div id=\"pdfPrewiewDiv\" class=\"my-preview-doc\"> </div>";
|
||||
htmlPanelFilePreview.add(new HTML(pdfPreview));
|
||||
showPDFPreview(result.getCompleteURL(), "pdfPrewiewDiv");
|
||||
}else {
|
||||
GWT.log("Mime type "+fileModel.getType()+" NOT allowed for preview, displaying 'No preview available'");
|
||||
htmlPanelFilePreview.add(noPreviewAvailable);
|
||||
htmlPanelFilePreview.setVisible(true);
|
||||
}
|
||||
}
|
||||
});
|
||||
}*/
|
||||
}
|
||||
|
||||
addHandlers();
|
||||
|
@ -602,7 +594,7 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
*/
|
||||
private void loadLocation(FileModel fileModel) {
|
||||
|
||||
setPlaceholder(txtLocation, "loading...");
|
||||
setPlaceholder(txtLocation, false, "loading...");
|
||||
AppControllerExplorer.rpcWorkspaceService.getListParentsByItemIdentifier(fileModel.getIdentifier(), false,
|
||||
new AsyncCallback<List<FileModel>>() {
|
||||
|
||||
|
@ -641,7 +633,7 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
*/
|
||||
private void loadSize(final String itemId) {
|
||||
GWT.log("Load size");
|
||||
setPlaceholder(txtSize, "loading...");
|
||||
setPlaceholder(txtSize, false, "loading...");
|
||||
fileSize = new Long(-1); //means is loading
|
||||
AppControllerExplorer.rpcWorkspaceService.loadSizeByItemId(itemId, new AsyncCallback<Long>() {
|
||||
|
||||
|
@ -673,7 +665,7 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
*/
|
||||
private void loadCreationDate(final String itemId) {
|
||||
|
||||
setPlaceholder(txtCreated, "loading...");
|
||||
setPlaceholder(txtCreated, false, "loading...");
|
||||
AppControllerExplorer.rpcWorkspaceService.getItemCreationDateById(itemId, new AsyncCallback<Date>() {
|
||||
|
||||
@Override
|
||||
|
@ -701,7 +693,7 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
*/
|
||||
private void loadLastModificationDate(final String itemId) {
|
||||
|
||||
setPlaceholder(txtLastMofication, "loading...");
|
||||
setPlaceholder(txtLastMofication, false, "loading...");
|
||||
AppControllerExplorer.rpcWorkspaceService.loadLastModificationDateById(itemId, new AsyncCallback<Date>() {
|
||||
|
||||
@Override
|
||||
|
@ -794,7 +786,7 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
*/
|
||||
private void loadACLsDescriptionForSharedFolder(String sharedId) {
|
||||
|
||||
setPlaceholder(txtSharedWith, "loading...");
|
||||
setPlaceholder(txtSharedWith, true, "loading...");
|
||||
|
||||
WorkspaceSharingServiceAsync.INSTANCE.getACLsDescriptionForSharedFolderId(sharedId,
|
||||
new AsyncCallback<String>() {
|
||||
|
@ -827,7 +819,7 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
htmlPanelImagePreview.setVisible(true);
|
||||
final HTML txtLoadingPreview = new HTML();
|
||||
htmlPanelImagePreview.add(txtLoadingPreview);
|
||||
setPlaceholder(txtLoadingPreview, "loading preview...");
|
||||
setPlaceholder(txtLoadingPreview, true, "loading preview...");
|
||||
|
||||
AppControllerExplorer.rpcWorkspaceService.getImageById(fileModel.getIdentifier(),
|
||||
fileModel.getGXTFolderItemType().equals(GXTFolderItemTypeEnum.IMAGE_DOCUMENT), false,
|
||||
|
@ -863,8 +855,12 @@ public class DialogGetInfoBootstrap extends Composite {
|
|||
* @param html the html
|
||||
* @param placeholder the placeholder
|
||||
*/
|
||||
private void setPlaceholder(HTML html, String placeholder) {
|
||||
html.setHTML(placeholder);
|
||||
private void setPlaceholder(HTML html, boolean spinner, String placeholder) {
|
||||
String loadingHMTL = placeholder;
|
||||
if(spinner) {
|
||||
loadingHMTL = "<span><img src=\""+spinnerImage.getUrl()+"\" style=\"padding-right:5px;\">"+placeholder+"</span>";
|
||||
}
|
||||
html.setHTML(loadingHMTL);
|
||||
html.getElement().addClassName("placeholder-loading");
|
||||
}
|
||||
|
||||
|
|
|
@ -399,7 +399,7 @@ IN THE 'DETAILS' PANEL*/
|
|||
}
|
||||
|
||||
.placeholder-loading {
|
||||
color: #E8E8E8;
|
||||
color: rgb(142, 142, 142);
|
||||
}
|
||||
|
||||
.shared-with-style{
|
||||
|
|
|
@ -53,6 +53,7 @@ import org.gcube.portlets.user.workspace.server.reader.ApplicationProfileReader;
|
|||
import org.gcube.portlets.user.workspace.server.tostoragehub.FormatterUtil;
|
||||
import org.gcube.portlets.user.workspace.server.tostoragehub.ObjectStorageHubToWorkpaceMapper;
|
||||
import org.gcube.portlets.user.workspace.server.tostoragehub.StorageHubToWorkpaceConverter;
|
||||
import org.gcube.portlets.user.workspace.server.util.MimeTypeUtility;
|
||||
import org.gcube.portlets.user.workspace.server.util.PortalContextInfo;
|
||||
import org.gcube.portlets.user.workspace.server.util.StringUtil;
|
||||
import org.gcube.portlets.user.workspace.server.util.WsUtil;
|
||||
|
@ -3077,6 +3078,14 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update description for item.
|
||||
*
|
||||
* @param itemId the item id
|
||||
* @param newDescription the new description
|
||||
* @return the string
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
@Override
|
||||
public String updateDescriptionForItem(String itemId, String newDescription) throws Exception {
|
||||
workspaceLogger.info("Called updateDescriptionForItem for itemID: " + itemId);
|
||||
|
@ -3101,4 +3110,24 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
|
|||
return newDescription;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Gets the allowed mimetypes for preview.
|
||||
*
|
||||
* @return the allowed mimetypes for preview
|
||||
*/
|
||||
|
||||
@Override
|
||||
public Map<String, List<String>> getAllowedMimetypesForPreview(){
|
||||
workspaceLogger.info("Called getAllowedMimetypesForPreview");
|
||||
|
||||
Map<String, List<String>> map = MimeTypeUtility.getPreviewMimetypeExtensionMap();
|
||||
|
||||
workspaceLogger.debug("Returning allowed mimetypes for preview: "+map.keySet());
|
||||
|
||||
return map;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import org.apache.tika.mime.MediaType;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
// TODO: Auto-generated Javadoc
|
||||
/**
|
||||
* The Class MimeTypeUtil.
|
||||
*
|
||||
|
@ -48,15 +49,19 @@ public class MimeTypeUtility {
|
|||
|
||||
protected static final Map<String, List<String>> mimetype_extension_map = new LinkedHashMap<String, List<String>>();
|
||||
protected static final Map<String, String> extension_mimetype_map = new LinkedHashMap<String, String>();
|
||||
protected static final Map<String, List<String>> preview_mimetype_extension_map = new LinkedHashMap<String, List<String>>();
|
||||
|
||||
static {
|
||||
InputStream extensionToMimetype = MimeTypeUtility.class
|
||||
.getResourceAsStream("/WsExtensionToMimeTypeMap.properties");
|
||||
InputStream mimetypeToExtension = MimeTypeUtility.class
|
||||
.getResourceAsStream("/WsMimeTypeToExtensionMap.properties");
|
||||
InputStream previewMimeTypeToExtension = MimeTypeUtility.class
|
||||
.getResourceAsStream("/PreviewMimeTypeToExtensionMap.properties");
|
||||
try {
|
||||
loadExtensions(extensionToMimetype);
|
||||
loadMimeTypes(mimetypeToExtension);
|
||||
loadPreviewMimeTypes(previewMimeTypeToExtension);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -115,6 +120,35 @@ public class MimeTypeUtility {
|
|||
br.close();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Load preview mime types.
|
||||
*
|
||||
* @param is the is
|
||||
* @throws IOException Signals that an I/O exception has occurred.
|
||||
*/
|
||||
protected static void loadPreviewMimeTypes(InputStream is) throws IOException {
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(is));
|
||||
|
||||
String line = br.readLine();
|
||||
|
||||
while (line != null) {
|
||||
String[] split = line.split("=");
|
||||
if (split.length == 2) {
|
||||
String mimeType = split[0];
|
||||
String extension = split[1];
|
||||
List<String> toExtensions = preview_mimetype_extension_map.get(mimeType);
|
||||
if (toExtensions == null) {
|
||||
toExtensions = new ArrayList<String>();
|
||||
}
|
||||
toExtensions.add(extension);
|
||||
preview_mimetype_extension_map.put(mimeType, toExtensions);
|
||||
}
|
||||
line = br.readLine();
|
||||
}
|
||||
br.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the extension.
|
||||
*
|
||||
|
@ -280,4 +314,15 @@ public class MimeTypeUtility {
|
|||
return extension_mimetype_map;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the preview mimetype extension map with the
|
||||
* mime types allowed for preview displaying
|
||||
*
|
||||
* @return the preview mimetype extension map
|
||||
*/
|
||||
public static Map<String, List<String>> getPreviewMimetypeExtensionMap() {
|
||||
return preview_mimetype_extension_map;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
application/msword=doc
|
||||
application/pdf=pdf
|
||||
application/rtf=rtf
|
||||
application/vnd.ms-excel=xls
|
||||
application/vnd.ms-powerpoint=ppt
|
||||
application/vnd.openxmlformats-officedocument.wordprocessingml.document=docx
|
||||
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet=xlsx
|
||||
application/vnd.openxmlformats-officedocument.presentationml.presentation=pptx
|
||||
application/x-javascript=js
|
||||
application/json=json
|
||||
audio/mid=mid
|
||||
audio/mpeg=mp3
|
||||
audio/x-wav=wav
|
||||
image/bmp=bmp
|
||||
image/gif=gif
|
||||
image/ief=ief
|
||||
image/jpeg=jpe
|
||||
image/jpeg=jpeg
|
||||
image/jpeg=jpg
|
||||
image/pipeg=jfif
|
||||
image/svg+xml=svg
|
||||
image/tiff=tif
|
||||
image/tiff=tiff
|
||||
image/x-cmu-raster=ras
|
||||
image/x-cmx=cmx
|
||||
image/x-icon=ico
|
||||
image/x-rgb=rgb
|
||||
text/css=css
|
||||
text/html=htm
|
||||
text/html=stm
|
||||
text/html=html
|
||||
text/plain=bas
|
||||
text/plain=c
|
||||
text/plain=h
|
||||
text/plain=txt
|
||||
text/richtext=rtx
|
||||
text/scriptlet=sct
|
||||
text/tab-separated-values=tsv
|
||||
text/uri-list=txt
|
||||
text/webviewhtml=htt
|
||||
text/x-component=htc
|
||||
video/mpeg=mp2
|
||||
video/mpeg=mpa
|
||||
video/mpeg=mpe
|
||||
video/mpeg=mpeg
|
||||
video/mpeg=mpg
|
||||
video/mpeg=mpv2
|
||||
video/quicktime=mov
|
||||
video/quicktime=qt
|
||||
video/x-la-asf=lsf
|
||||
video/x-la-asf=lsx
|
||||
video/x-ms-asf=asf
|
||||
video/x-ms-asf=asr
|
||||
video/x-ms-asf=asx
|
||||
video/x-msvideo=avi
|
||||
video/x-sgi-movie=movie
|
||||
x-world/x-vrml=flr
|
||||
x-world/x-vrml=vrml
|
||||
x-world/x-vrml=wrl
|
||||
x-world/x-vrml=wrz
|
||||
x-world/x-vrml=xaf
|
||||
x-world/x-vrml=xof
|
Loading…
Reference in New Issue