Compare commits

..

20 Commits

Author SHA1 Message Date
449020a9a4 php: json response 2017-09-28 18:18:23 +03:00
22f2f0f922 mvc: json response 2017-09-28 17:55:01 +03:00
1aa7e73d79 csharp: json response 2017-09-28 17:47:54 +03:00
6eaa290557 Merge branch 'hotfix/v5.0.1' into develop 2017-09-26 14:14:40 +03:00
ed8df66513 support OpenDocument Flat Document file type 2017-09-26 14:11:18 +03:00
16d942a487 support OpenDocument Flat Document file type 2017-09-26 13:24:34 +03:00
5c6d9ec008 v5.0.0 2017-09-19 17:04:59 +03:00
8e7f7c20e4 nodejs: fix opening history without changes 2017-09-14 16:07:53 +03:00
b3f7e9861f Merge remote-tracking branch 'remotes/origin/release/v5.0.0' into develop
# Conflicts:
#	web/documentserver-example/nodejs/config/default.json
#	web/documentserver-example/nodejs/helpers/fileUtility.js
2017-09-07 15:58:30 +03:00
797696ceea Merge branch 'feature/m-formats' into develop 2017-09-07 15:54:54 +03:00
af30096d71 Fix editable formats list 2017-09-07 15:54:14 +03:00
8a7193a645 support template formats 2017-09-07 15:52:47 +03:00
84f5be3556 change viewed formats list 2017-09-07 15:47:47 +03:00
cff90de454 nodejs: edit link only for editable format 2017-09-07 13:51:33 +03:00
18b7bdb401 support convertation -m formats to -x 2017-09-07 12:28:46 +03:00
75155b4c54 Fix Bug 35704 - commenting in review mode 2017-09-06 11:19:11 +03:00
4c3bc0e7ef convert docm,dot,dotm,dotx,xlsm,xlt,xltm,xltx,pot,potm,potx,ppsm,pptm to OOX format 2017-09-06 11:09:29 +03:00
908affc61c Fix Bug 35704 - commenting in review mode 2017-08-28 17:17:45 +03:00
c5b227d278 remove preselected lang value (Bug 35603) 2017-08-28 16:08:32 +03:00
74537582d7 support -m formats 2017-08-04 17:39:02 +03:00
20 changed files with 269 additions and 362 deletions

View File

@ -29,10 +29,8 @@ using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Configuration;
using System.Xml;
using System.Xml.Linq;
using System.Web.Helpers;
namespace OnlineEditorsExampleMVC.Helpers
{
@ -108,28 +106,51 @@ namespace OnlineEditorsExampleMVC.Helpers
out string convertedDocumentUri)
{
convertedDocumentUri = string.Empty;
var responceFromConvertService =
SendRequestToConvertService(documentUri, fromExtension, toExtension, documentRevisionId, isAsync)
.Root;
var errorElement = responceFromConvertService.Element("Error");
if (errorElement != null)
ProcessConvertServiceResponceError(Convert.ToInt32(errorElement.Value));
fromExtension = string.IsNullOrEmpty(fromExtension) ? Path.GetExtension(documentUri) : fromExtension;
var isEndConvert = Convert.ToBoolean(responceFromConvertService.Element("EndConvert").Value);
var percent = Convert.ToInt32(responceFromConvertService.Element("Percent").Value);
var title = Path.GetFileName(documentUri);
title = string.IsNullOrEmpty(title) ? Guid.NewGuid().ToString() : title;
if (isEndConvert)
documentRevisionId = string.IsNullOrEmpty(documentRevisionId)
? documentUri
: documentRevisionId;
documentRevisionId = GenerateRevisionId(documentRevisionId);
var request = (HttpWebRequest)WebRequest.Create(DocumentConverterUrl);
request.Method = "POST";
request.ContentType = "application/json";
request.Accept = "application/json";
request.Timeout = ConvertTimeout;
var bodyString = string.Format("{{\"async\": {0},\"filetype\": \"{1}\",\"key\": \"{2}\",\"outputtype\": \"{3}\",\"title\": \"{4}\",\"url\": \"{5}\"}}",
isAsync.ToString().ToLower(),
fromExtension.Trim('.'),
documentRevisionId,
toExtension.Trim('.'),
title,
documentUri);
var bytes = Encoding.UTF8.GetBytes(bodyString);
request.ContentLength = bytes.Length;
using (var requestStream = request.GetRequestStream())
{
convertedDocumentUri = responceFromConvertService.Element("FileUrl").Value;
percent = 100;
}
else
{
percent = percent >= 100 ? 99 : percent;
requestStream.Write(bytes, 0, bytes.Length);
}
return percent;
string dataResponse;
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
if (stream == null) throw new Exception("Response is null");
using (var reader = new StreamReader(stream))
{
dataResponse = reader.ReadToEnd();
}
}
return GetResponseUri(dataResponse, out convertedDocumentUri);
}
/// <summary>
@ -167,15 +188,20 @@ namespace OnlineEditorsExampleMVC.Helpers
request.GetRequestStream().Write(buffer, 0, readed);
}
string dataResponse;
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
if (stream == null) throw new WebException("Could not get an answer");
var xDocumentResponse = XDocument.Load(new XmlTextReader(stream));
string externalUri;
GetResponseUri(xDocumentResponse, out externalUri);
return externalUri;
using (var reader = new StreamReader(stream))
{
dataResponse = reader.ReadToEnd();
}
}
string externalUri;
GetResponseUri(dataResponse, out externalUri);
return externalUri;
}
/// <summary>
@ -195,77 +221,44 @@ namespace OnlineEditorsExampleMVC.Helpers
#region private method
/// <summary>
/// Request for conversion to a service
/// Processing document received from the editing service
/// </summary>
/// <param name="documentUri">Uri for the document to convert</param>
/// <param name="fromExtension">Document extension</param>
/// <param name="toExtension">Extension to which to convert</param>
/// <param name="documentRevisionId">Key for caching on service</param>
/// <param name="isAsync">Perform conversions asynchronously</param>
/// <returns>Xml document request result of conversion</returns>
private static XDocument SendRequestToConvertService(string documentUri, string fromExtension, string toExtension, string documentRevisionId, bool isAsync)
/// <param name="jsonDocumentResponse">The resulting json from editing service</param>
/// <param name="responseUri">Uri to the converted document</param>
/// <returns>The percentage of completion of conversion</returns>
private static int GetResponseUri(string jsonDocumentResponse, out string responseUri)
{
fromExtension = string.IsNullOrEmpty(fromExtension) ? Path.GetExtension(documentUri) : fromExtension;
if (string.IsNullOrEmpty(jsonDocumentResponse)) throw new ArgumentException("Invalid param", "jsonDocumentResponse");
var title = Path.GetFileName(documentUri);
title = string.IsNullOrEmpty(title) ? Guid.NewGuid().ToString() : title;
var responseFromService = Json.Decode(jsonDocumentResponse);
if (jsonDocumentResponse == null) throw new WebException("Invalid answer format");
documentRevisionId = string.IsNullOrEmpty(documentRevisionId)
? documentUri
: documentRevisionId;
documentRevisionId = GenerateRevisionId(documentRevisionId);
var errorElement = responseFromService.error;
if (errorElement != null) ProcessResponseError(Convert.ToInt32(errorElement));
var req = (HttpWebRequest)WebRequest.Create(DocumentConverterUrl);
req.Method = "POST";
req.ContentType = "text/json";
req.Timeout = ConvertTimeout;
var isEndConvert = responseFromService.endConvert;
var bodyString = string.Format("{{\"async\": {0},\"filetype\": \"{1}\",\"key\": \"{2}\",\"outputtype\": \"{3}\",\"title\": \"{4}\",\"url\": \"{5}\"}}",
isAsync.ToString().ToLower(),
fromExtension.Trim('.'),
documentRevisionId,
toExtension.Trim('.'),
title,
documentUri);
var bytes = Encoding.UTF8.GetBytes(bodyString);
req.ContentLength = bytes.Length;
using (var requestStream = req.GetRequestStream())
int resultPercent;
responseUri = string.Empty;
if (isEndConvert)
{
requestStream.Write(bytes, 0, bytes.Length);
responseUri = responseFromService.fileUrl;
resultPercent = 100;
}
else
{
resultPercent = responseFromService.percent;
if (resultPercent >= 100) resultPercent = 99;
}
Stream stream = null;
var countTry = 0;
while (countTry < MaxTry)
{
try
{
countTry++;
stream = req.GetResponse().GetResponseStream();
break;
}
catch (WebException ex)
{
if (ex.Status != WebExceptionStatus.Timeout)
{
throw new HttpException((int) HttpStatusCode.BadRequest, "Bad Request", ex);
}
}
}
if (countTry == MaxTry)
{
throw new WebException("Timeout", WebExceptionStatus.Timeout);
}
return XDocument.Load(new XmlTextReader(stream));
return resultPercent;
}
/// <summary>
/// Generate an error code table
/// </summary>
/// <param name="errorCode">Error code</param>
private static void ProcessConvertServiceResponceError(int errorCode)
private static void ProcessResponseError(int errorCode)
{
var errorMessage = string.Empty;
const string errorMessageTemplate = "Error occurred in the ConvertService.ashx: {0}";
@ -315,45 +308,6 @@ namespace OnlineEditorsExampleMVC.Helpers
throw new Exception(errorMessage);
}
/// <summary>
/// Processing document received from the editing service
/// </summary>
/// <param name="xDocumentResponse">The resulting xml from editing service</param>
/// <param name="responseUri">Uri to the converted document</param>
/// <returns>The percentage of completion of conversion</returns>
private static int GetResponseUri(XDocument xDocumentResponse, out string responseUri)
{
var responceFromConvertService = xDocumentResponse.Root;
if (responceFromConvertService == null) throw new WebException("Invalid answer format");
var errorElement = responceFromConvertService.Element("Error");
if (errorElement != null) ProcessConvertServiceResponceError(Convert.ToInt32(errorElement.Value));
var endConvert = responceFromConvertService.Element("EndConvert");
if (endConvert == null) throw new WebException("Invalid answer format");
var isEndConvert = Convert.ToBoolean(endConvert.Value);
var resultPercent = 0;
responseUri = string.Empty;
if (isEndConvert)
{
var fileUrl = responceFromConvertService.Element("FileUrl");
if (fileUrl == null) throw new WebException("Invalid answer format");
responseUri = fileUrl.Value;
resultPercent = 100;
}
else
{
var percent = responceFromConvertService.Element("Percent");
if (percent != null)
resultPercent = Convert.ToInt32(percent.Value);
resultPercent = resultPercent >= 100 ? 99 : resultPercent;
}
return resultPercent;
}
#endregion
}
}

View File

@ -51,22 +51,26 @@ namespace OnlineEditorsExampleMVC.Models
public static readonly List<string> ExtsDocument = new List<string>
{
".docx", ".doc", ".odt", ".rtf", ".txt",
".html", ".htm", ".mht", ".pdf", ".djvu",
".fb2", ".epub", ".xps"
".doc", ".docx", ".docm",
".dot", ".dotx", ".dotm",
".odt", ".fodt", ".rtf", ".txt",
".html", ".htm", ".mht",
".pdf", ".djvu", ".fb2", ".epub", ".xps"
};
public static readonly List<string> ExtsSpreadsheet = new List<string>
{
".xls", ".xlsx",
".ods", ".csv"
".xls", ".xlsx", ".xlsm",
".xlt", ".xltx", ".xltm",
".ods", ".fods", ".csv"
};
public static readonly List<string> ExtsPresentation = new List<string>
{
".pps", ".ppsx",
".ppt", ".pptx",
".odp"
".pps", ".ppsx", ".ppsm",
".ppt", ".pptx", ".pptm",
".pot", ".potx", ".potm",
".odp", ".fodp"
};
}
}

View File

@ -49,12 +49,10 @@
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Core" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Web.Abstractions" />
<Reference Include="System.Web.Routing" />
<Reference Include="System.Xml" />
<Reference Include="System.Configuration" />
<Reference Include="System.Web.Services" />
<Reference Include="System.EnterpriseServices" />

View File

@ -9,9 +9,9 @@
<add key="filesize-max" value="5242880"/>
<add key="files.docservice.viewed-docs" value=".ppt|.pps|.odp|.pdf|.djvu|.epub|.xps"/>
<add key="files.docservice.edited-docs" value=".docx|.doc|.odt|.xlsx|.xls|.ods|.csv|.pptx|.ppsx|.rtf|.txt|.mht|.html|.htm"/>
<add key="files.docservice.convert-docs" value=".doc|.odt|.xls|.ods|.ppt|.pps|.odp|.rtf|.mht|.html|.htm|.epub"/>
<add key="files.docservice.viewed-docs" value=".pdf|.djvu|.xps"/>
<add key="files.docservice.edited-docs" value=".docx|.xlsx|.csv|.pptx|.ppsx|.txt"/>
<add key="files.docservice.convert-docs" value=".docm|.dotx|.dotm|.dot|.doc|.odt|.fodt|.xlsm|.xltx|.xltm|.xlt|.xls|.ods|.fods|.pptm|.ppt|.ppsm|.pps|.potx|.potm|.pot|.odp|.fodp|.rtf|.mht|.html|.htm|.epub"/>
<add key="files.docservice.timeout" value="120000" />
<add key="files.docservice.url.storage" value="https://doc.onlyoffice.com/FileUploader.ashx"/>

View File

@ -42,22 +42,26 @@ namespace OnlineEditorsExample
{
public static readonly List<string> ExtsSpreadsheet = new List<string>
{
".xls", ".xlsx",
".ods", ".csv"
".xls", ".xlsx", ".xlsm",
".xlt", ".xltx", ".xltm",
".ods", ".fods", ".csv"
};
public static readonly List<string> ExtsPresentation = new List<string>
{
".pps", ".ppsx",
".ppt", ".pptx",
".odp"
".pps", ".ppsx", ".ppsm",
".ppt", ".pptx", ".pptm",
".pot", ".potx", ".potm",
".odp", ".fodp"
};
public static readonly List<string> ExtsDocument = new List<string>
{
".docx", ".doc", ".odt", ".rtf", ".txt",
".html", ".htm", ".mht", ".pdf", ".djvu",
".fb2", ".epub", ".xps"
".doc", ".docx", ".docm",
".dot", ".dotx", ".dotm",
".odt", ".fodt", ".rtf", ".txt",
".html", ".htm", ".mht",
".pdf", ".djvu", ".fb2", ".epub", ".xps"
};
public static string GetInternalExtension(string extension)

View File

@ -24,16 +24,14 @@
*
*/
using System.Text;
using OnlineEditorsExample;
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Configuration;
using System.Xml;
using System.Xml.Linq;
using System.Web.Helpers;
using OnlineEditorsExample;
namespace ASC.Api.DocumentConverter
{
@ -76,11 +74,6 @@ namespace ASC.Api.DocumentConverter
/// </summary>
private const string ConvertParams = "?url={0}&outputtype={1}&filetype={2}&title={3}&key={4}";
/// <summary>
/// Number of tries request conversion
/// </summary>
private const int MaxTry = 3;
#endregion
#region public method
@ -109,28 +102,57 @@ namespace ASC.Api.DocumentConverter
out string convertedDocumentUri)
{
convertedDocumentUri = string.Empty;
var responceFromConvertService =
SendRequestToConvertService(documentUri, fromExtension, toExtension, documentRevisionId, isAsync)
.Root;
var errorElement = responceFromConvertService.Element("Error");
if (errorElement != null)
ProcessConvertServiceResponceError(Convert.ToInt32(errorElement.Value));
fromExtension = string.IsNullOrEmpty(fromExtension) ? Path.GetExtension(documentUri) : fromExtension;
var isEndConvert = Convert.ToBoolean(responceFromConvertService.Element("EndConvert").Value);
var percent = Convert.ToInt32(responceFromConvertService.Element("Percent").Value);
var title = Path.GetFileName(documentUri);
title = string.IsNullOrEmpty(title) ? Guid.NewGuid().ToString() : title;
if (isEndConvert)
documentRevisionId = string.IsNullOrEmpty(documentRevisionId)
? documentUri
: documentRevisionId;
documentRevisionId = GenerateRevisionId(documentRevisionId);
var request = (HttpWebRequest)WebRequest.Create(DocumentConverterUrl);
request.Method = "POST";
request.ContentType = "application/json";
request.Accept = "application/json";
request.Timeout = ConvertTimeout;
var bodyString = string.Format("{{\"async\": {0},\"filetype\": \"{1}\",\"key\": \"{2}\",\"outputtype\": \"{3}\",\"title\": \"{4}\",\"url\": \"{5}\"}}",
isAsync.ToString().ToLower(),
fromExtension.Trim('.'),
documentRevisionId,
toExtension.Trim('.'),
title,
documentUri);
var bytes = Encoding.UTF8.GetBytes(bodyString);
request.ContentLength = bytes.Length;
using (var requestStream = request.GetRequestStream())
{
convertedDocumentUri = responceFromConvertService.Element("FileUrl").Value;
percent = 100;
}
else
{
percent = percent >= 100 ? 99 : percent;
requestStream.Write(bytes, 0, bytes.Length);
}
return percent;
// hack. http://ubuntuforums.org/showthread.php?t=1841740
if (_Default.IsMono)
{
ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true;
}
string dataResponse;
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
if (stream == null) throw new Exception("Response is null");
using (var reader = new StreamReader(stream))
{
dataResponse = reader.ReadToEnd();
}
}
return GetResponseUri(dataResponse, out convertedDocumentUri);
}
/// <summary>
@ -158,6 +180,7 @@ namespace ASC.Api.DocumentConverter
var request = (HttpWebRequest)WebRequest.Create(urlTostorage);
request.Method = "POST";
request.ContentType = contentType;
request.Accept = "application/json";
request.ContentLength = contentLength;
const int bufferSize = 2048;
@ -173,16 +196,21 @@ namespace ASC.Api.DocumentConverter
{
ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true;
}
string dataResponse;
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
if (stream == null) throw new WebException("Could not get an answer");
var xDocumentResponse = XDocument.Load(new XmlTextReader(stream));
string externalUri;
GetResponseUri(xDocumentResponse, out externalUri);
return externalUri;
using (var reader = new StreamReader(stream))
{
dataResponse = reader.ReadToEnd();
}
}
string externalUri;
GetResponseUri(dataResponse, out externalUri);
return externalUri;
}
/// <summary>
@ -200,85 +228,46 @@ namespace ASC.Api.DocumentConverter
#endregion
#region private method
/// <summary>
/// Request for conversion to a service
/// Processing document received from the editing service
/// </summary>
/// <param name="documentUri">Uri for the document to convert</param>
/// <param name="fromExtension">Document extension</param>
/// <param name="toExtension">Extension to which to convert</param>
/// <param name="documentRevisionId">Key for caching on service</param>
/// <param name="isAsync">Perform conversions asynchronously</param>
/// <returns>Xml document request result of conversion</returns>
private static XDocument SendRequestToConvertService(string documentUri, string fromExtension, string toExtension, string documentRevisionId, bool isAsync)
/// <param name="jsonDocumentResponse">The resulting json from editing service</param>
/// <param name="responseUri">Uri to the converted document</param>
/// <returns>The percentage of completion of conversion</returns>
private static int GetResponseUri(string jsonDocumentResponse, out string responseUri)
{
fromExtension = string.IsNullOrEmpty(fromExtension) ? Path.GetExtension(documentUri) : fromExtension;
if (string.IsNullOrEmpty(jsonDocumentResponse)) throw new ArgumentException("Invalid param", "jsonDocumentResponse");
var title = Path.GetFileName(documentUri);
title = string.IsNullOrEmpty(title) ? Guid.NewGuid().ToString() : title;
var responseFromService = Json.Decode(jsonDocumentResponse);
if (jsonDocumentResponse == null) throw new WebException("Invalid answer format");
documentRevisionId = string.IsNullOrEmpty(documentRevisionId)
? documentUri
: documentRevisionId;
documentRevisionId = GenerateRevisionId(documentRevisionId);
var errorElement = responseFromService.error;
if (errorElement != null) ProcessResponseError(Convert.ToInt32(errorElement));
var req = (HttpWebRequest)WebRequest.Create(DocumentConverterUrl);
req.Method = "POST";
req.ContentType = "text/json";
req.Timeout = ConvertTimeout;
var isEndConvert = responseFromService.endConvert;
var bodyString = string.Format("{{\"async\": {0},\"filetype\": \"{1}\",\"key\": \"{2}\",\"outputtype\": \"{3}\",\"title\": \"{4}\",\"url\": \"{5}\"}}",
isAsync.ToString().ToLower(),
fromExtension.Trim('.'),
documentRevisionId,
toExtension.Trim('.'),
title,
documentUri);
var bytes = Encoding.UTF8.GetBytes(bodyString);
req.ContentLength = bytes.Length;
using (var requestStream = req.GetRequestStream())
int resultPercent;
responseUri = string.Empty;
if (isEndConvert)
{
requestStream.Write(bytes, 0, bytes.Length);
responseUri = responseFromService.fileUrl;
resultPercent = 100;
}
else
{
resultPercent = responseFromService.percent;
if (resultPercent >= 100) resultPercent = 99;
}
var countTry = 0;
Stream stream = null;
// hack. http://ubuntuforums.org/showthread.php?t=1841740
if (_Default.IsMono)
{
ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true;
}
while (countTry < MaxTry)
{
try
{
countTry++;
stream = req.GetResponse().GetResponseStream();
break;
}
catch (WebException ex)
{
if (ex.Status != WebExceptionStatus.Timeout)
{
throw new HttpException((int) HttpStatusCode.BadRequest, "Bad Request", ex);
}
}
}
if (countTry == MaxTry)
{
throw new WebException("Timeout", WebExceptionStatus.Timeout);
}
return XDocument.Load(new XmlTextReader(stream));
return resultPercent;
}
/// <summary>
/// Generate an error code table
/// </summary>
/// <param name="errorCode">Error code</param>
private static void ProcessConvertServiceResponceError(int errorCode)
private static void ProcessResponseError(int errorCode)
{
var errorMessage = string.Empty;
const string errorMessageTemplate = "Error occurred in the ConvertService.ashx: {0}";
@ -328,45 +317,6 @@ namespace ASC.Api.DocumentConverter
throw new Exception(errorMessage);
}
/// <summary>
/// Processing document received from the editing service
/// </summary>
/// <param name="xDocumentResponse">The resulting xml from editing service</param>
/// <param name="responseUri">Uri to the converted document</param>
/// <returns>The percentage of completion of conversion</returns>
private static int GetResponseUri(XDocument xDocumentResponse, out string responseUri)
{
var responceFromConvertService = xDocumentResponse.Root;
if (responceFromConvertService == null) throw new WebException("Invalid answer format");
var errorElement = responceFromConvertService.Element("Error");
if (errorElement != null) ProcessConvertServiceResponceError(Convert.ToInt32(errorElement.Value));
var endConvert = responceFromConvertService.Element("EndConvert");
if (endConvert == null) throw new WebException("Invalid answer format");
var isEndConvert = Convert.ToBoolean(endConvert.Value);
var resultPercent = 0;
responseUri = string.Empty;
if (isEndConvert)
{
var fileUrl = responceFromConvertService.Element("FileUrl");
if (fileUrl == null) throw new WebException("Invalid answer format");
responseUri = fileUrl.Value;
resultPercent = 100;
}
else
{
var percent = responceFromConvertService.Element("Percent");
if (percent != null)
resultPercent = Convert.ToInt32(percent.Value);
resultPercent = resultPercent >= 100 ? 99 : resultPercent;
}
return resultPercent;
}
#endregion
}
}

View File

@ -44,12 +44,12 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Web" />
<Reference Include="System.Xml" />
<Reference Include="System.Web.Helpers" />
<Reference Include="System.Web.Services" />
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Content Include="App_Themes\images\file_docx.png" />

View File

@ -5,9 +5,9 @@
<add key="filesize-max" value="5242880"/>
<add key="storage-path" value=""/>
<add key="files.docservice.viewed-docs" value=".ppt|.pps|.odp|.pdf|.djvu|.epub|.xps"/>
<add key="files.docservice.edited-docs" value=".docx|.doc|.odt|.xlsx|.xls|.ods|.csv|.pptx|.ppsx|.rtf|.txt|.mht|.html|.htm"/>
<add key="files.docservice.convert-docs" value=".doc|.odt|.xls|.ods|.ppt|.pps|.odp|.rtf|.mht|.html|.htm|.epub"/>
<add key="files.docservice.viewed-docs" value=".pdf|.djvu|.xps"/>
<add key="files.docservice.edited-docs" value=".docx|.xlsx|.csv|.pptx|.ppsx|.txt"/>
<add key="files.docservice.convert-docs" value=".docm|.dotx|.dotm|.dot|.doc|.odt|.fodt|.xlsm|.xltx|.xltm|.xlt|.xls|.ods|.fods|.pptm|.ppt|.ppsm|.pps|.potx|.potm|.pot|.odp|.fodp|.rtf|.mht|.html|.htm|.epub"/>
<add key="files.docservice.timeout" value="120000" />
<add key="files.docservice.url.storage" value="https://doc.onlyoffice.com/FileUploader.ashx"/>

View File

@ -37,14 +37,14 @@ import java.util.Map;
public class FileUtility
{
static {}
public static FileType GetFileType(String fileName)
{
String ext = GetFileExtension(fileName).toLowerCase();
if (ExtsDocument.contains(ext))
return FileType.Text;
if (ExtsSpreadsheet.contains(ext))
return FileType.Spreadsheet;
@ -56,26 +56,33 @@ public class FileUtility
public static List<String> ExtsDocument = Arrays.asList
(
".docx", ".doc", ".odt", ".rtf", ".txt",
".html", ".htm", ".mht", ".pdf", ".djvu",
".fb2", ".epub", ".xps"
".doc", ".docx", ".docm",
".dot", ".dotx", ".dotm",
".odt", ".fodt", ".rtf", ".txt",
".html", ".htm", ".mht",
".pdf", ".djvu", ".fb2", ".epub", ".xps"
);
public static List<String> ExtsSpreadsheet = Arrays.asList
(
".xls", ".xlsx", ".ods", ".csv"
".xls", ".xlsx", ".xlsm",
".xlt", ".xltx", ".xltm",
".ods", ".fods", ".csv"
);
public static List<String> ExtsPresentation = Arrays.asList
(
".pps", ".ppsx", ".ppt", ".pptx",".odp"
".pps", ".ppsx", ".ppsm",
".ppt", ".pptx", ".pptm",
".pot", ".potx", ".potm",
".odp", ".fodp"
);
public static String GetFileName (String url)
{
if(url == null) return null;
//for external file url
String tempstorage = ConfigManager.GetProperty("files.docservice.url.tempstorage");
if(!tempstorage.isEmpty() && url.startsWith(tempstorage))
@ -87,7 +94,7 @@ public class FileUtility
String fileName = url.substring(url.lastIndexOf('/')+1, url.length());
return fileName;
}
public static String GetFileNameWithoutExtension (String url)
{
String fileName = GetFileName(url);

View File

@ -1,9 +1,9 @@
filesize-max=5242880
storage-folder=app_data
files.docservice.viewed-docs=.ppt|.pps|.odp|.pdf|.djvu|.epub|.xps
files.docservice.edited-docs=.docx|.doc|.odt|.xlsx|.xls|.ods|.csv|.pptx|.ppsx|.rtf|.txt|.mht|.html|.htm
files.docservice.convert-docs=.doc|.odt|.xls|.ods|.ppt|.pps|.odp|.rtf|.mht|.html|.htm|.epub
files.docservice.viewed-docs=.pdf|.djvu|.xps
files.docservice.edited-docs=.docx|.xlsx|.csv|.pptx|.ppsx|.txt
files.docservice.convert-docs=.docm|.dotx|.dotm|.dot|.doc|.odt|.fodt|.xlsm|.xltx|.xltm|.xlt|.xls|.ods|.fods|.pptm|.ppt|.ppsm|.pps|.potx|.potm|.pot|.odp|.fodp|.rtf|.mht|.html|.htm|.epub
files.docservice.timeout=120000
files.docservice.url.storage=https://doc.onlyoffice.com/FileUploader.ashx

View File

@ -73,8 +73,8 @@ function key(k) {
};
var getDocumentType = function (ext) {
if (".docx.doc.odt.rtf.txt.html.htm.mht.pdf.djvu.fb2.epub.xps".indexOf(ext) != -1) return "text";
if (".xls.xlsx.ods.csv".indexOf(ext) != -1) return "spreadsheet";
if (".pps.ppsx.ppt.pptx.odp".indexOf(ext) != -1) return "presentation";
if (".doc.docx.docm.dot.dotx.dotm.odt.fodt.rtf.txt.html.htm.mht.pdf.djvu.fb2.epub.xps".indexOf(ext) != -1) return "text";
if (".xls.xlsx.xlsm.xlt.xltx.xltm.ods.fods.csv".indexOf(ext) != -1) return "spreadsheet";
if (".pps.ppsx.ppsm.ppt.pptx.pptm.pot.potx.potm.odp.fodp".indexOf(ext) != -1) return "presentation";
return null;
};

View File

@ -519,7 +519,7 @@ app.get("/editor", function (req, res) {
var fileName = fileUtility.getFileName(req.query.fileName);
var key = docManager.getKey(fileName);
var url = docManager.getFileUri(fileName);
var mode = req.query.mode || "edit"; //mode: view/edit
var mode = req.query.mode || "edit"; //mode: view/edit/review/comment/embedded
var type = req.query.type || ""; //type: embedded/mobile/desktop
if (type == "") {
type = new RegExp(configServer.get("mobileRegEx"), "i").test(req.get('User-Agent')) ? "mobile" : "desktop";
@ -550,14 +550,15 @@ app.get("/editor", function (req, res) {
key: keyVersion,
url: i == countVersion ? url : (docManager.getlocalFileUri(fileName, i, true) + "/prev" + fileUtility.getFileExtension(fileName)),
};
if (i > 1) {
if (i > 1 && docManager.existsSync(docManager.diffPath(fileName, userAddress, i-1))) {
historyD.previous = {
key: historyData[i-2].key,
url: historyData[i-2].url,
};
historyD.changesUrl = docManager.getlocalFileUri(fileName, i-1) + "/diff.zip";
}
historyData.push(historyD);
if (i < countVersion) {
@ -597,7 +598,7 @@ app.get("/editor", function (req, res) {
callbackUrl: docManager.getCallback(fileName),
isEdit: canEdit && mode == "edit",
review: mode == "edit" || mode == "review",
comment: mode == "edit" || mode == "comment",
comment: mode != "view" && mode != "embedded",
mode: canEdit && mode != "view" ? "edit" : "view",
canBackToFolder: type != "embedded",
backUrl: docManager.getServerUrl(),

View File

@ -20,9 +20,9 @@
"apiUrl": "web-apps/apps/api/documents/api.js",
"preloaderUrl": "web-apps/apps/api/documents/cache-scripts.html",
"exampleUrl": null,
"viewedDocs": [".ppt", ".pps", ".odp", ".pdf", ".djvu", ".epub", ".xps"],
"editedDocs": [".docx", ".doc", ".odt", ".docm", ".dot", ".dotm", ".dotx", ".xlsx", ".xls", ".ods", ".csv", ".xlsm", ".xlt", ".xltm", ".xltx", ".pptx", ".ppsx", ".pot", ".potm", ".potx", ".ppsm", ".pptm", ".rtf", ".txt", ".mht", ".html", ".htm"],
"convertedDocs": [".doc", ".odt", ".xls", ".ods", ".ppt", ".pps", ".odp", ".rtf", ".mht", ".html", ".htm", ".epub", ".dot", ".xlt", ".pot"],
"viewedDocs": [".pdf", ".djvu", ".xps"],
"editedDocs": [".docx", ".xlsx", ".csv", ".pptx", ".ppsx", ".txt"],
"convertedDocs": [".docm", ".doc", ".dotx", ".dotm", ".dot", ".odt", ".fodt", ".xlsm", ".xls", ".xltx", ".xltm", ".xlt", ".ods", ".fods", ".pptm", ".ppt", ".ppsm", ".pps", ".potx", ".potm", ".pot", ".odp", ".fodp", ".rtf", ".mht", ".html", ".htm", ".epub"],
"storageFolder": "files",
"maxFileSize": 1073741824,
"mobileRegEx": "android|avantgo|playbook|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino",

View File

@ -244,7 +244,8 @@ docManager.getStoredFiles = function () {
const item = {
time: time,
name: storedFiles[i],
documentType: fileUtility.getFileType(storedFiles[i])
documentType: fileUtility.getFileType(storedFiles[i]),
canEdit: configServer.get("editedDocs").indexOf(fileUtility.getFileExtension(storedFiles[i])) != -1
};
if (!result.length) {
@ -313,7 +314,10 @@ docManager.getDate = function (date) {
};
docManager.getChanges = function (fileName) {
return JSON.parse(fileSystem.readFileSync(fileName));
if (this.existsSync(fileName)) {
return JSON.parse(fileSystem.readFileSync(fileName));
}
return null;
};
docManager.countVersion = function(directory) {

View File

@ -77,11 +77,11 @@ fileUtility.fileType = {
presentation: "presentation"
}
fileUtility.documentExts = [".docx", ".doc", ".odt", ".rtf", ".txt", ".html", ".htm", ".mht", ".pdf", ".djvu", ".fb2", ".epub", ".xps", ".docm", ".dot", ".dotm", ".dotx"];
fileUtility.documentExts = [".doc", ".docx", ".docm", ".dot", ".dotx", ".dotm", ".odt", ".fodt", ".rtf", ".txt", ".html", ".htm", ".mht", ".pdf", ".djvu", ".fb2", ".epub", ".xps"];
fileUtility.spreadsheetExts = [".xls", ".xlsx", ".ods", ".csv", ".xlsm", ".xlt", ".xltm", ".xltx"];
fileUtility.spreadsheetExts = [".xls", ".xlsx", ".xlsm", ".xlt", ".xltx", ".xltm", ".ods", ".fods", ".csv"];
fileUtility.presentationExts = [".pps", ".ppsx", ".ppt", ".pptx", ".odp", ".pot", ".potm", ".potx", ".ppsm", ".pptm"];
fileUtility.presentationExts = [".pps", ".ppsx", ".ppsm", ".ppt", ".pptx", ".pptm", ".pot", ".potx", ".potm", ".odp", ".fodp"];
function getUrlParams(url) {
try {

View File

@ -63,7 +63,7 @@
<tr>
<td valign="middle" width="30%">
<select class="select-user" id="language">
<option value="en" selected>English</option>
<option value="en">English</option>
<option value="de">Deutsch</option>
<option value="es">Espanol</option>
<option value="fr">Francais</option>
@ -145,6 +145,7 @@
<a class="delete-file" data="<%= encodeURIComponent(storedFiles[i].name) %>">
<img class="icon-delete" src="images/delete-24.png" alt="Delete" title="Delete" /></a>
</td>
<% if (storedFiles[i].canEdit) { %>
<td class="contentCells contentCells-icon">
<a href="editor?type=desktop&fileName=<%= encodeURIComponent(storedFiles[i].name) + params %>" target="_blank">
<img src="images/desktop-24.png" alt="Open in editor for full size screens" title="Open in editor for full size screens" /></a>
@ -165,6 +166,9 @@
<img src="images/comment-24.png" alt="Open in editor for comment" title="Open in editor for comment" /></a>
<% } %>
</td>
<% } else { %>
<td class="contentCells contentCells-shift contentCells-icon" colspan="4"></td>
<% } %>
<td class="contentCells contentCells-icon">
<a href="editor?type=desktop&mode=view&fileName=<%= encodeURIComponent(storedFiles[i].name) + params %>" target="_blank">
<img src="images/desktop-24.png" alt="Open in viewer for full size screens" title="Open in viewer for full size screens" /></a>

View File

@ -6,9 +6,9 @@ $GLOBALS['ALONE'] = FALSE;
$GLOBALS['MODE'] = "";
$GLOBALS['DOC_SERV_VIEWD'] = array(".ppt",".pps",".odp",".pdf",".djvu",".epub",".xps");
$GLOBALS['DOC_SERV_EDITED'] = array(".docx",".doc",".odt",".xlsx",".xls",".ods",".csv",".pptx",".ppsx",".rtf",".txt",".mht",".html",".htm");
$GLOBALS['DOC_SERV_CONVERT'] = array(".doc",".odt",".xls",".ods",".ppt",".pps",".odp",".rtf",".mht",".html",".htm",".epub");
$GLOBALS['DOC_SERV_VIEWD'] = array(".pdf", ".djvu", ".xps");
$GLOBALS['DOC_SERV_EDITED'] = array(".docx", ".xlsx", ".csv", ".pptx", ".ppsx", ".txt");
$GLOBALS['DOC_SERV_CONVERT'] = array(".docm", ".doc", ".dotx", ".dotm", ".dot", ".odt", ".fodt", ".xlsm", ".xls", ".xltx", ".xltm", ".xlt", ".ods", ".fods", ".pptm", ".ppt", ".ppsm", ".pps", ".potx", ".potm", ".pot", ".odp", ".fodp", ".rtf", ".mht", ".html", ".htm", ".epub");
$GLOBALS['DOC_SERV_TIMEOUT'] = "120000";
@ -23,16 +23,20 @@ $GLOBALS['EXAMPLE_URL'] = "";
$GLOBALS['MOBILE_REGEX'] = "android|avantgo|playbook|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino";
$GLOBALS['ExtsSpreadsheet'] = array(".xls", ".xlsx",
".ods", ".csv");
$GLOBALS['ExtsSpreadsheet'] = array(".xls", ".xlsx", ".xlsm",
".xlt", ".xltx", ".xltm",
".ods", ".fods", ".csv");
$GLOBALS['ExtsPresentation'] = array(".pps", ".ppsx",
".ppt", ".pptx",
".odp");
$GLOBALS['ExtsPresentation'] = array(".pps", ".ppsx", ".ppsm",
".ppt", ".pptx", ".pptm",
".pot", ".potx", ".potm",
".odp", ".fodp");
$GLOBALS['ExtsDocument'] = array(".docx", ".doc", ".odt", ".rtf", ".txt",
".html", ".htm", ".mht", ".pdf", ".djvu",
".fb2", ".epub", ".xps");
$GLOBALS['ExtsDocument'] = array(".doc", ".docx", ".docm",
".dot", ".dotx", ".dotm",
".odt", ".fodt", ".rtf", ".txt",
".html", ".htm", ".mht",
".pdf", ".djvu", ".fb2", ".epub", ".xps");
if ( !defined('ServiceConverterMaxTry') )
define( 'ServiceConverterMaxTry', 3);

View File

@ -49,7 +49,8 @@ function GetExternalFileUri($local_uri) {
'method' => 'POST',
'header' => "User-Agent: " . $_SERVER['HTTP_USER_AGENT'] . "\r\n" .
"Content-Type: " . $contentType . "\r\n" .
"Content-Length: " . strlen($fileContents) . "\r\n",
"Content-Length: " . strlen($fileContents) . "\r\n" .
"Accept: application/json\r\n",
'content' => $fileContents,
'timeout' => $GLOBALS['DOC_SERV_TIMEOUT']
)
@ -185,7 +186,7 @@ function GenerateRevisionId($expected_key) {
* @param string $document_revision_id Key for caching on service
* @param bool $is_async Perform conversions asynchronously
*
* @return Xml document request result of conversion
* @return Document request result of conversion
*/
function SendRequestToConvertService($document_uri, $from_extension, $to_extension, $document_revision_id, $is_async) {
if (empty($from_extension))
@ -218,13 +219,13 @@ function SendRequestToConvertService($document_uri, $from_extension, $to_extensi
)
);
$response_xml_data;
$countTry = 0;
$opts = array('http' => array(
'method' => 'POST',
'timeout' => $GLOBALS['DOC_SERV_TIMEOUT'],
'header'=> "Content-type: application/json\r\n",
'header'=> "Content-type: application/json\r\n" .
"Accept: application/json\r\n",
'content' => $data
)
);
@ -237,8 +238,8 @@ function SendRequestToConvertService($document_uri, $from_extension, $to_extensi
while ($countTry < ServiceConverterMaxTry)
{
$countTry = $countTry + 1;
$response_xml_data = file_get_contents($urlToConverter, FALSE, $context);
if ($response_xml_data !== false) { break; }
$response_data = file_get_contents($urlToConverter, FALSE, $context);
if ($response_data !== false) { break; }
}
if ($countTry == ServiceConverterMaxTry)
@ -246,19 +247,6 @@ function SendRequestToConvertService($document_uri, $from_extension, $to_extensi
throw new Exception ("Bad Request or timeout error");
}
libxml_use_internal_errors(true);
if (!function_exists('simplexml_load_file')) {
throw new Exception("Server can't read xml");
}
$response_data = simplexml_load_string($response_xml_data);
if (!$response_data) {
$exc = "Bad Response. Errors: ";
foreach(libxml_get_errors() as $error) {
$exc = $exc . "\t" . $error->message;
}
throw new Exception ($exc);
}
return $response_data;
}
@ -304,39 +292,28 @@ function GetConvertedUri($document_uri, $from_extension, $to_extension, $documen
/**
* Processing document received from the editing service.
*
* @param string $x_document_response The resulting xml from editing service
* @param string $document_response The result from editing service
* @param string $response_uri Uri to the converted document
*
* @return The percentage of completion of conversion
*/
function GetResponseUri($x_document_response, &$response_uri) {
function GetResponseUri($document_response, &$response_uri) {
$response_uri = "";
$resultPercent = 0;
libxml_use_internal_errors(true);
if (!function_exists('simplexml_load_file')) {
throw new Exception("Server can't read xml");
}
$data = simplexml_load_string($x_document_response);
if (!$data) {
$errs = "Invalid answer format. Errors: ";
foreach(libxml_get_errors() as $error) {
$errs = $errs . '\t' . $error->message;
}
throw new Exception ($errs);
if (!$document_response) {
$errs = "Invalid answer format";
}
$errorElement = $data->Error;
if ($errorElement != NULL && $errorElement != "") ProcessConvServResponceError($data->Error);
$errorElement = $document_response->Error;
if ($errorElement != NULL && $errorElement != "") ProcessConvServResponceError($document_response->Error);
$endConvert = $data->EndConvert;
$endConvert = $document_response->EndConvert;
if ($endConvert != NULL && $endConvert == "") throw new Exception("Invalid answer format");
if ($endConvert != NULL && strtolower($endConvert) == true)
{
$fileUrl = $data->FileUrl;
$fileUrl = $document_response->FileUrl;
if ($fileUrl == NULL || $fileUrl == "") throw new Exception("Invalid answer format");
$response_uri = $fileUrl;
@ -344,7 +321,7 @@ function GetResponseUri($x_document_response, &$response_uri) {
}
else
{
$percent = $data->Percent;
$percent = $document_response->Percent;
if ($percent != NULL && $percent != "")
$resultPercent = $percent;

View File

@ -1,10 +1,10 @@
class FileUtility
@@exts_document = %w(.docx .doc .odt .rtf .txt .html .htm .mht .pdf .djvu .fb2 .epub .xps)
@@exts_document = %w(.doc .docx .docm .dot .dotx .dotm .odt .fodt .rtf .txt .html .htm .mht .pdf .djvu .fb2 .epub .xps)
@@exts_spreadsheet = %w(.xls .xlsx .ods .csv)
@@exts_spreadsheet = %w(.xls .xlsx .xlsm .xlt .xltx .xltm .ods .fods .csv)
@@exts_presentation = %w(.pps .ppsx .ppt .pptx .odp)
@@exts_presentation = %w(.pps .ppsx .ppsm .ppt .pptx .pptm .pot .potx .potm .odp .fodp)
class << self

View File

@ -35,9 +35,9 @@ module OnlineEditorsExampleRuby
Rails.configuration.storagePath="app_data"
Rails.configuration.timeout=120
Rails.configuration.viewedDocs=".ppt|.pps|.odp|.pdf|.djvu|.epub|.xps"
Rails.configuration.editedDocs=".docx|.doc|.odt|.xlsx|.xls|.ods|.csv|.pptx|.ppsx|.rtf|.txt|.mht|.html|.htm"
Rails.configuration.convertDocs=".doc|.odt|.xls|.ods|.ppt|.pps|.odp|.rtf|.mht|.html|.htm|.epub"
Rails.configuration.viewedDocs=".pdf|.djvu|.xps"
Rails.configuration.editedDocs=".docx|.xlsx|.csv|.pptx|.ppsx|.txt"
Rails.configuration.convertDocs=".docm|.dotx|.dotm|.dot|.doc|.odt|.fodt|.xlsm|.xltx|.xltm|.xlt|.xls|.ods|.fods|.pptm|.ppt|.ppsm|.pps|.potx|.potm|.pot|.odp|.fodp|.rtf|.mht|.html|.htm|.epub"
Rails.configuration.urlStorage="https://doc.onlyoffice.com/FileUploader.ashx"
Rails.configuration.urlConverter="https://doc.onlyoffice.com/ConvertService.ashx"