public ActionResult Download(Guid id, string encodedName, string encodedPath) { var name = PathEncoder.Decode(encodedName); var path = PathEncoder.Decode(encodedPath); //Response.BufferOutput = false; //Response.Charset = ""; Response.ContentType = "application/zip"; var repo = RepositoryRepository.GetRepository(id); string headerValue = ContentDispositionUtil.GetHeaderValue((name ?? repo.Name) + ".zip"); Response.Headers.Add("Content-Disposition", headerValue); using (var outputZip = new ZipFile()) { outputZip.UseZip64WhenSaving = Zip64Option.Always; outputZip.AlternateEncodingUsage = ZipOption.AsNecessary; outputZip.AlternateEncoding = Encoding.Unicode; using (var browser = new RepositoryBrowser(Path.Combine(UserConfiguration.Current.Repositories, repo.Name))) { AddTreeToZip(browser, name, path, outputZip); } outputZip.Save(Response.Body); return(new EmptyResult()); } }
public ActionResult Download(string id, string encodedName, string encodedPath) { if (String.IsNullOrEmpty(id)) { return(HttpNotFound()); } var name = PathEncoder.Decode(encodedName); var path = PathEncoder.Decode(encodedPath); Response.BufferOutput = false; Response.Charset = ""; Response.ContentType = "application/zip"; string headerValue = ContentDispositionUtil.GetHeaderValue((name ?? id) + ".zip"); Response.AddHeader("Content-Disposition", headerValue); using (var outputZip = new ZipFile()) { outputZip.UseZip64WhenSaving = Zip64Option.Always; outputZip.AlternateEncodingUsage = ZipOption.AsNecessary; outputZip.AlternateEncoding = Encoding.Unicode; using (var browser = new RepositoryBrowser(Path.Combine(UserConfiguration.Current.Repositories, id))) { AddTreeToZip(browser, name, path, outputZip); } outputZip.Save(Response.OutputStream); return(new EmptyResult()); } }
private static void SendStreamByChunks(HttpContext context, long toRead, string title, Stream fileStream, ref bool flushed) { context.Response.Buffer = false; context.Response.AddHeader("Connection", "Keep-Alive"); context.Response.AddHeader("Content-Length", toRead.ToString(CultureInfo.InvariantCulture)); context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(title)); context.Response.ContentType = MimeMapping.GetMimeMapping(title); const int bufferSize = 32 * 1024; // 32KB var buffer = new byte[bufferSize]; while (toRead > 0) { var length = fileStream.Read(buffer, 0, bufferSize); if (context.Response.IsClientConnected) { context.Response.OutputStream.Write(buffer, 0, length); context.Response.Flush(); flushed = true; toRead -= length; } else { toRead = -1; Global.Logger.Warn(string.Format("IsClientConnected is false. Why? Download file {0} Connection is lost. ", title)); } } }
public Uri GetPreSignedUri(File file, TimeSpan expires) { return(Global.GetStore().GetPreSignedUri(string.Empty, GetUniqFilePath(file), expires, new List <String> { String.Concat("Content-Disposition:", ContentDispositionUtil.GetHeaderValue(file.Title, withoutBase: true)) })); }
private static void TempFile(HttpContext context) { var fileName = context.Request[FilesLinkUtility.FileTitle]; var auth = context.Request[FilesLinkUtility.AuthKey]; var validateResult = EmailValidationKeyProvider.ValidateEmailKey(fileName, auth ?? "", Global.StreamUrlExpire); if (validateResult != EmailValidationKeyProvider.ValidationResult.Ok) { var exc = new HttpException((int)HttpStatusCode.Forbidden, FilesCommonResource.ErrorMassage_SecurityException); Global.Logger.Error(string.Format("{0} {1}: {2}", FilesLinkUtility.AuthKey, validateResult, context.Request.Url), exc); context.Response.StatusCode = (int)HttpStatusCode.Forbidden; context.Response.Write(FilesCommonResource.ErrorMassage_SecurityException); return; } context.Response.Clear(); context.Response.ContentType = MimeMapping.GetMimeMapping(fileName); context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(fileName)); var store = Global.GetStore(); var path = Path.Combine("temp_stream", fileName); if (!store.IsFile(FileConstant.StorageDomainTmp, path)) { context.Response.StatusCode = (int)HttpStatusCode.NotFound; context.Response.Write(FilesCommonResource.ErrorMassage_FileNotFound); return; } using (var readStream = store.GetReadStream(FileConstant.StorageDomainTmp, path)) { context.Response.AddHeader("Content-Length", readStream.Length.ToString(CultureInfo.InvariantCulture)); readStream.StreamCopyTo(context.Response.OutputStream); } store.Delete(FileConstant.StorageDomainTmp, path); try { context.Response.Flush(); context.Response.SuppressContent = true; context.ApplicationInstance.CompleteRequest(); } catch (HttpException he) { Global.Logger.ErrorFormat("TempFile", he); } }
private static void DownloadAllZipped(int messageId, HttpContext context) { var engine = new EngineFactory(TenantId, Username); var attachments = engine.AttachmentEngine.GetAttachments(new ConcreteMessageAttachmentsExp(messageId, TenantId, Username)); if (!attachments.Any()) { return; } using (var zip = new ZipFile()) { zip.CompressionLevel = CompressionLevel.Level3; zip.AlternateEncodingUsage = ZipOption.AsNecessary; zip.AlternateEncoding = Encoding.GetEncoding(Thread.CurrentThread.CurrentCulture.TextInfo.OEMCodePage); foreach (var attachment in attachments) { using (var file = attachment.ToAttachmentStream()) { var filename = file.FileName; if (zip.ContainsEntry(filename)) { var counter = 1; var tempName = filename; while (zip.ContainsEntry(tempName)) { tempName = filename; var suffix = " (" + counter + ")"; tempName = 0 < tempName.IndexOf('.') ? tempName.Insert(tempName.LastIndexOf('.'), suffix) : tempName + suffix; counter++; } filename = tempName; } zip.AddEntry(filename, file.FileStream.ReadToEnd()); } } context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(Defines.ARCHIVE_NAME)); zip.Save(context.Response.OutputStream); } }
private void DownloadAllZipped(int message_id, HttpContext context) { var mail_box_manager = new MailBoxManager(0); var attachments = mail_box_manager.GetMessageAttachments(TenantId, Username, message_id); if (attachments.Any()) { using (var zip = new ZipFile()) { zip.CompressionLevel = CompressionLevel.Level3; zip.AlternateEncodingUsage = ZipOption.AsNecessary; zip.AlternateEncoding = Encoding.GetEncoding(Thread.CurrentThread.CurrentCulture.TextInfo.OEMCodePage); foreach (var attachment in attachments) { using (var file = AttachmentManager.GetAttachmentStream(attachment)) { var filename = file.FileName; if (zip.ContainsEntry(filename)) { var counter = 1; var temp_name = filename; while (zip.ContainsEntry(temp_name)) { temp_name = filename; var suffix = " (" + counter + ")"; temp_name = 0 < temp_name.IndexOf('.') ? temp_name.Insert(temp_name.LastIndexOf('.'), suffix) : temp_name + suffix; counter++; } filename = temp_name; } zip.AddEntry(filename, file.FileStream.GetCorrectBuffer()); } } context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(ArchiveName)); zip.Save(context.Response.OutputStream); } } }
private static void BulkDownloadFile(HttpContext context) { if (!SecurityContext.AuthenticateMe(CookiesManager.GetCookies(CookiesType.AuthKey))) { context.Response.StatusCode = (int)HttpStatusCode.Forbidden; return; } var store = Global.GetStore(); var path = string.Format(@"{0}\{1}.zip", SecurityContext.CurrentAccount.ID, FileConstant.DownloadTitle); if (!store.IsFile(FileConstant.StorageDomainTmp, path)) { Global.Logger.ErrorFormat("BulkDownload file error. File is not exist on storage. UserId: {0}.", SecurityContext.CurrentAccount.ID); context.Response.StatusCode = (int)HttpStatusCode.NotFound; } else { if (store is S3Storage) { var url = store.GetPreSignedUri(FileConstant.StorageDomainTmp, path, TimeSpan.FromHours(1), null).ToString(); context.Response.Redirect(url); } else { context.Response.Clear(); context.Response.ContentType = "application/zip"; context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(FileConstant.DownloadTitle + ".zip")); using (var readStream = store.IronReadStream(FileConstant.StorageDomainTmp, path, 40)) { context.Response.AddHeader("Content-Length", readStream.Length.ToString()); readStream.StreamCopyTo(context.Response.OutputStream); } try { context.Response.Flush(); context.Response.End(); } catch (HttpException) { } } } }
private void DownloadFile(int attachmentId, HttpContext context) { var mailBoxManager = new MailBoxManager(); var auth = context.Request[FilesLinkUtility.AuthKey]; var openTempStream = false; if (!string.IsNullOrEmpty(auth)) { var stream = context.Request.QueryString["stream"]; if (!string.IsNullOrEmpty(stream)) { int validateTimespan; int.TryParse(WebConfigurationManager.AppSettings["files.stream-url-minute"], out validateTimespan); if (validateTimespan <= 0) { validateTimespan = 5; } var validateResult = EmailValidationKeyProvider.ValidateEmailKey(attachmentId + stream, auth, TimeSpan.FromMinutes(validateTimespan)); if (validateResult != EmailValidationKeyProvider.ValidationResult.Ok) { var exc = new HttpException((int)HttpStatusCode.Forbidden, "You don't have enough permission to perform the operation"); //Global.Logger.Error(string.Format("{0} {1}: {2}", CommonLinkUtility.AuthKey, validateResult, context.Request.Url), exc); throw exc; } openTempStream = true; } } using (var file = openTempStream ? mailBoxManager.GetAttachmentStream(attachmentId, TenantId) : mailBoxManager.GetAttachmentStream(attachmentId, TenantId, Username)) { context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(file.FileName)); file.FileStream.StreamCopyTo(context.Response.OutputStream); } }
public override void ExecuteResult(ControllerContext context) { if (context.IsNull()) { throw new ArgumentNullException("context"); } HttpResponseBase response = context.HttpContext.Response; response.ContentType = ContentType; if (!String.IsNullOrEmpty(FileDownloadName)) { // From RFC 2183, Sec. 2.3: // The sender may want to suggest a filename to be used if the entity is // detached and stored in a separate file. If the receiving MUA writes // the entity to a file, the suggested filename should be used as a // basis for the actual filename, where possible. string headerValue = ContentDispositionUtil.GetHeaderValue(FileDownloadName, DispositionResult); context.HttpContext.Response.AddHeader("Content-Disposition", headerValue); } WriteFile(response); }
public void DowloadInfo(RIFileModel model, string path) { model.Path = path; model = GetModelStream(model); var downLoadName = GetDownLoadFileName(model.FileName, model.Path); var filename = ""; if (HttpContext.Current.Request.Browser.Browser == "IE" || Regex.IsMatch(HttpContext.Current.Request.UserAgent, @"Trident/7.*rv:11")) { filename = HttpUtility.UrlEncode(downLoadName); } filename = ContentDispositionUtil.GetHeaderValue(downLoadName); HttpContext.Current.Response.Charset = "UTF-8"; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8"); HttpContext.Current.Response.ContentType = model.MimeType; HttpContext.Current.Response.AddHeader("Content-disposition", filename); HttpContext.Current.Response.BinaryWrite(model.Stream.GetBuffer()); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); }
/// <inheritdoc /> public override Task ExecuteResultAsync([NotNull] ActionContext context) { var response = context.HttpContext.Response; response.ContentType = ContentType; if (!string.IsNullOrEmpty(FileDownloadName)) { // From RFC 2183, Sec. 2.3: // The sender may want to suggest a filename to be used if the entity is // detached and stored in a separate file. If the receiving MUA writes // the entity to a file, the suggested filename should be used as a // basis for the actual filename, where possible. var headerValue = ContentDispositionUtil.GetHeaderValue(FileDownloadName); context.HttpContext.Response.Headers.Set("Content-Disposition", headerValue); } // We aren't flowing the cancellation token appropiately, see // https://github.com/aspnet/Mvc/issues/743 for details. return(WriteFileAsync(response, CancellationToken.None)); }
public static string GetPreSignedUri(int fileId, int tenant, string user, string stream, int fileNumber, string fileName, IDataStore dataStore) { var attachmentPath = GetFileKey(user, stream, fileNumber, fileName); if (dataStore == null) { dataStore = MailDataStore.GetDataStore(tenant); } string url; if (dataStore is S3Storage) { var contentDispositionFileName = ContentDispositionUtil.GetHeaderValue(fileName, withoutBase: true); var headersForUrl = new [] { "Content-Disposition:" + contentDispositionFileName }; url = dataStore.GetPreSignedUri("", attachmentPath, TimeSpan.FromMinutes(10), headersForUrl).ToString(); } else { //TODO: Move url to config; attachmentPath = "/addons/mail/httphandlers/download.ashx"; var uriBuilder = new UriBuilder(CommonLinkUtility.GetFullAbsolutePath(attachmentPath)); if (uriBuilder.Uri.IsLoopback) { uriBuilder.Host = Dns.GetHostName(); } var query = uriBuilder.Query; query += "attachid=" + fileId + "&"; query += "stream=" + stream + "&"; query += FilesLinkUtility.AuthKey + "=" + EmailValidationKeyProvider.GetEmailKey(fileId + stream); url = uriBuilder.Uri + "?" + query; } return(url); }
public string StoreCKeditorImageWithoutQuota(int id_tenant, string id_user, int id_mailbox, string file_name, byte[] image_data, IDataStore storage) { try { if (image_data == null || image_data.Length == 0) { throw new ArgumentNullException("image_data"); } var ext = string.IsNullOrEmpty(file_name) ? ".jpg" : Path.GetExtension(file_name); if (string.IsNullOrEmpty(ext)) { ext = ".jpg"; } var store_name = image_data.GetMd5(); store_name = Path.ChangeExtension(store_name, ext); var content_disposition = ContentDispositionUtil.GetHeaderValue(store_name); var content_type = ActiveUp.Net.Mail.MimeTypesHelper.GetMimeqType(ext); var signature_image_path = MailStoragePathCombiner.GerStoredSignatureImagePath(id_mailbox, store_name); using (var reader = new MemoryStream(image_data)) { var upload_url = storage.UploadWithoutQuota(id_user, signature_image_path, reader, content_type, content_disposition); return(MailStoragePathCombiner.GetStoredUrl(upload_url)); } } catch (Exception e) { _log.Error("StoreCKeditorImageWithoutQuota(). filename: {0} Exception:\r\n{1}\r\n", file_name, e.ToString()); throw; } }
public string StoreCKeditorImageWithoutQuota(int mailboxId, string fileName, byte[] imageData, IDataStore storage) { try { if (imageData == null || imageData.Length == 0) { throw new ArgumentNullException("imageData"); } var ext = string.IsNullOrEmpty(fileName) ? ".jpg" : Path.GetExtension(fileName); if (string.IsNullOrEmpty(ext)) { ext = ".jpg"; } var storeName = imageData.GetMd5(); storeName = Path.ChangeExtension(storeName, ext); var contentDisposition = ContentDispositionUtil.GetHeaderValue(storeName); var contentType = MimeMapping.GetMimeMapping(ext); var signatureImagePath = MailStoragePathCombiner.GerStoredSignatureImagePath(User, mailboxId, storeName); using (var reader = new MemoryStream(imageData)) { var uploadUrl = storage.Save(string.Empty, signatureImagePath, reader, contentType, contentDisposition); return(MailStoragePathCombiner.GetStoredUrl(uploadUrl)); } } catch (Exception e) { Log.ErrorFormat("StoreCKeditorImageWithoutQuota(). filename: {0} Exception:\r\n{1}\r\n", fileName, e.ToString()); throw; } }
private static void BulkDownloadFile(HttpContext context) { var store = Global.GetStore(); var path = string.Format(@"{0}\{1}.zip", SecurityContext.CurrentAccount.ID, UrlConstant.DownloadTitle); if (!store.IsFile(FileConstant.StorageDomainTmp, path)) { context.Response.Redirect("~/404.htm"); } else { if (store is S3Storage) { var url = store.GetPreSignedUri(FileConstant.StorageDomainTmp, path, TimeSpan.FromMinutes(5), null).ToString(); context.Response.Redirect(url); } else { context.Response.Clear(); context.Response.ContentType = "application/zip"; context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(UrlConstant.DownloadTitle + ".zip")); using (var readStream = store.IronReadStream(FileConstant.StorageDomainTmp, path, 40)) { context.Response.AddHeader("Content-Length", readStream.Length.ToString()); readStream.StreamCopyTo(context.Response.OutputStream); } try { context.Response.Flush(); context.Response.End(); } catch (HttpException) { } } } }
private static void DifferenceFile(HttpContext context) { try { using (var fileDao = Global.DaoFactory.GetFileDao()) { var id = context.Request[FilesLinkUtility.FileId]; int version; int.TryParse(context.Request[FilesLinkUtility.Version] ?? "", out version); var doc = context.Request[FilesLinkUtility.DocShareKey]; File file; var linkRight = FileShareLink.Check(doc, fileDao, out file); if (linkRight == FileShare.Restrict && !SecurityContext.IsAuthenticated) { var auth = context.Request[FilesLinkUtility.AuthKey]; var validateResult = EmailValidationKeyProvider.ValidateEmailKey(id + version, auth ?? "", Global.StreamUrlExpire); if (validateResult != EmailValidationKeyProvider.ValidationResult.Ok) { var exc = new HttpException((int)HttpStatusCode.Forbidden, FilesCommonResource.ErrorMassage_SecurityException); Global.Logger.Error(string.Format("{0} {1}: {2}", FilesLinkUtility.AuthKey, validateResult, context.Request.Url), exc); context.Response.StatusCode = (int)HttpStatusCode.Forbidden; context.Response.Write(FilesCommonResource.ErrorMassage_SecurityException); return; } } fileDao.InvalidateCache(id); if (file == null || version > 0 && file.Version != version) { file = version > 0 ? fileDao.GetFile(id, version) : fileDao.GetFile(id); } if (file == null) { context.Response.StatusCode = (int)HttpStatusCode.NotFound; return; } if (linkRight == FileShare.Restrict && SecurityContext.IsAuthenticated && !Global.GetFilesSecurity().CanRead(file)) { context.Response.StatusCode = (int)HttpStatusCode.Forbidden; return; } if (!string.IsNullOrEmpty(file.Error)) { context.Response.StatusDescription = file.Error; context.Response.StatusCode = (int)HttpStatusCode.BadRequest; return; } context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(".zip")); context.Response.ContentType = MimeMapping.GetMimeMapping(".zip"); using (var stream = fileDao.GetDifferenceStream(file)) { context.Response.AddHeader("Content-Length", stream.Length.ToString(CultureInfo.InvariantCulture)); stream.StreamCopyTo(context.Response.OutputStream); } } } catch (Exception ex) { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.Write(ex.Message); Global.Logger.Error("Error for: " + context.Request.Url, ex); return; } try { context.Response.Flush(); context.Response.SuppressContent = true; context.ApplicationInstance.CompleteRequest(); } catch (HttpException he) { Global.Logger.ErrorFormat("DifferenceFile", he); } }
private static void DownloadFile(int attachmentId, HttpContext context) { var auth = context.Request[FilesLinkUtility.AuthKey]; var openTempStream = false; if (!string.IsNullOrEmpty(auth)) { var stream = context.Request.QueryString["stream"]; if (!string.IsNullOrEmpty(stream)) { int validateTimespan; int.TryParse(ConfigurationManagerExtension.AppSettings["files.stream-url-minute"], out validateTimespan); if (validateTimespan <= 0) { validateTimespan = 5; } var validateResult = EmailValidationKeyProvider.ValidateEmailKey(attachmentId + stream, auth, TimeSpan.FromMinutes(validateTimespan)); if (validateResult != EmailValidationKeyProvider.ValidationResult.Ok) { var exc = new HttpException((int)HttpStatusCode.Forbidden, "You don't have enough permission to perform the operation"); //Global.Logger.Error(string.Format("{0} {1}: {2}", CommonLinkUtility.AuthKey, validateResult, context.Request.Url), exc); throw exc; } openTempStream = true; } } else { if (!SecurityContext.IsAuthenticated) { throw new HttpException(403, "Access denied."); } } var engine = new EngineFactory(TenantId, Username); var attachment = engine.AttachmentEngine.GetAttachment( openTempStream ? (IAttachmentExp) new ConcreteTenantAttachmentExp(attachmentId, TenantId) : new ConcreteUserAttachmentExp(attachmentId, TenantId, Username)); long offset = 0; long endOffset = -1; long length = attachment.size; if (context.Request.Headers["Range"] != null) { var range = context.Request.Headers["Range"].Split('=', '-'); offset = Convert.ToInt64(range[1]); if (range.Count() > 2 && !string.IsNullOrEmpty(range[2])) { endOffset = Convert.ToInt64(range[2]); } if (endOffset < 0 || endOffset >= attachment.size) { endOffset = attachment.size - 1; } length = endOffset - offset + 1; if (length <= 0) { throw new HttpException("Wrong Range header"); } context.Response.StatusCode = 206; context.Response.AddHeader("Content-Range", String.Format(" bytes {0}-{1}/{2}", offset, endOffset, attachment.size)); } using (var file = attachment.ToAttachmentStream((int)offset)) { context.Response.AddHeader("Accept-Ranges", "bytes"); context.Response.AddHeader("Content-Length", length.ToString(CultureInfo.InvariantCulture)); context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(file.FileName)); context.Response.ContentType = MimeMapping.GetMimeMapping(file.FileName); if (endOffset != attachment.size - 1) { file.FileStream.CopyTo(context.Response.OutputStream); } else { file.FileStream.StreamCopyTo(context.Response.OutputStream, (int)length); } } }
public FileUploadResult ProcessUpload(HttpContext context) { if (!VoipNumberData.Allowed || !CRMSecurity.IsAdmin) { throw CRMSecurity.CreateSecurityException(); } if (context.Request.Files.Count == 0) { return(Error("No files.")); } var file = context.Request.Files[0]; if (file.ContentLength <= 0 || file.ContentLength > maxFileSize * 1024L * 1024L) { return(Error(StudioResources.Resource.FileSizeMaxExceed)); } try { var path = file.FileName; AudioType audioType; if (Enum.TryParse(context.Request["audioType"], true, out audioType)) { path = Path.Combine(audioType.ToString().ToLower(), path); } var uri = Global.GetStore().Save("voip", path, file.InputStream, MimeMapping.GetMimeMapping(file.FileName), ContentDispositionUtil.GetHeaderValue(file.FileName, withoutBase: true)); return(Success(new VoipUpload { AudioType = audioType, Name = file.FileName, Path = CommonLinkUtility.GetFullAbsolutePath(uri.ToString()) })); } catch (Exception error) { return(Error(error.Message)); } }
private static void DownloadFile(HttpContext context) { var flushed = false; try { var id = context.Request[FilesLinkUtility.FileId]; var doc = context.Request[FilesLinkUtility.DocShareKey] ?? ""; using (var fileDao = Global.DaoFactory.GetFileDao()) { File file; var readLink = FileShareLink.Check(doc, true, fileDao, out file); if (!readLink && file == null) { fileDao.InvalidateCache(id); int version; file = int.TryParse(context.Request[FilesLinkUtility.Version], out version) && version > 0 ? fileDao.GetFile(id, version) : fileDao.GetFile(id); } if (file == null) { context.Response.StatusCode = (int)HttpStatusCode.NotFound; return; } if (!readLink && !Global.GetFilesSecurity().CanRead(file)) { context.Response.StatusCode = (int)HttpStatusCode.Forbidden; return; } if (!string.IsNullOrEmpty(file.Error)) { throw new Exception(file.Error); } if (!fileDao.IsExistOnStorage(file)) { Global.Logger.ErrorFormat("Download file error. File is not exist on storage. File id: {0}.", file.ID); context.Response.StatusCode = (int)HttpStatusCode.NotFound; return; } FileMarker.RemoveMarkAsNew(file); context.Response.Clear(); context.Response.ClearHeaders(); context.Response.Charset = "utf-8"; var title = file.Title.Replace(',', '_'); var ext = FileUtility.GetFileExtension(file.Title); var outType = context.Request[FilesLinkUtility.OutType]; if (!string.IsNullOrEmpty(outType)) { outType = outType.Trim(); if (FileUtility.ExtsConvertible[ext].Contains(outType)) { ext = outType; title = FileUtility.ReplaceFileExtension(title, ext); } } context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(title)); context.Response.ContentType = MimeMapping.GetMimeMapping(title); //// Download file via nginx //if (CoreContext.Configuration.Standalone && // WorkContext.IsMono && // Global.GetStore() is DiscDataStore && // !file.ProviderEntry && // !FileConverter.EnableConvert(file, ext) // ) //{ // var diskDataStore = (DiscDataStore)Global.GetStore(); // var pathToFile = diskDataStore.GetPhysicalPath(String.Empty, FileDao.GetUniqFilePath(file)); // context.Response.Headers.Add("X-Accel-Redirect", "/filesData" + pathToFile); // FilesMessageService.Send(file, context.Request, MessageAction.FileDownloaded, file.Title); // return; //} if (string.Equals(context.Request.Headers["If-None-Match"], GetEtag(file))) { //Its cached. Reply 304 context.Response.StatusCode = (int)HttpStatusCode.NotModified; context.Response.Cache.SetETag(GetEtag(file)); } else { context.Response.CacheControl = "public"; context.Response.Cache.SetETag(GetEtag(file)); context.Response.Cache.SetCacheability(HttpCacheability.Public); Stream fileStream = null; try { if (file.ContentLength <= SetupInfo.AvailableFileSize) { if (!FileConverter.EnableConvert(file, ext)) { if (!readLink && fileDao.IsSupportedPreSignedUri(file)) { context.Response.Redirect(fileDao.GetPreSignedUri(file, TimeSpan.FromHours(1)).ToString(), true); return; } fileStream = fileDao.GetFileStream(file); context.Response.AddHeader("Content-Length", file.ContentLength.ToString(CultureInfo.InvariantCulture)); } else { fileStream = FileConverter.Exec(file, ext); context.Response.AddHeader("Content-Length", fileStream.Length.ToString(CultureInfo.InvariantCulture)); } fileStream.StreamCopyTo(context.Response.OutputStream); if (!context.Response.IsClientConnected) { Global.Logger.Warn(String.Format("Download file error {0} {1} Connection is lost. Too long to buffer the file", file.Title, file.ID)); } FilesMessageService.Send(file, context.Request, MessageAction.FileDownloaded, file.Title); context.Response.Flush(); flushed = true; } else { context.Response.Buffer = false; context.Response.ContentType = "application/octet-stream"; long offset = 0; if (context.Request.Headers["Range"] != null) { context.Response.StatusCode = 206; var range = context.Request.Headers["Range"].Split(new[] { '=', '-' }); offset = Convert.ToInt64(range[1]); } if (offset > 0) { Global.Logger.Info("Starting file download offset is " + offset); } context.Response.AddHeader("Connection", "Keep-Alive"); context.Response.AddHeader("Accept-Ranges", "bytes"); if (offset > 0) { context.Response.AddHeader("Content-Range", String.Format(" bytes {0}-{1}/{2}", offset, file.ContentLength - 1, file.ContentLength)); } var dataToRead = file.ContentLength; const int bufferSize = 8 * 1024; // 8KB var buffer = new Byte[bufferSize]; if (!FileConverter.EnableConvert(file, ext)) { if (!readLink && fileDao.IsSupportedPreSignedUri(file)) { context.Response.Redirect(fileDao.GetPreSignedUri(file, TimeSpan.FromHours(1)).ToString(), true); return; } fileStream = fileDao.GetFileStream(file, offset); context.Response.AddHeader("Content-Length", (file.ContentLength - offset).ToString(CultureInfo.InvariantCulture)); } else { fileStream = FileConverter.Exec(file, ext); if (offset > 0) { var startBytes = offset; while (startBytes > 0) { long readCount; if (bufferSize >= startBytes) { readCount = startBytes; } else { readCount = bufferSize; } var length = fileStream.Read(buffer, 0, (int)readCount); startBytes -= length; } } } while (dataToRead > 0) { int length; try { length = fileStream.Read(buffer, 0, bufferSize); } catch (HttpException exception) { Global.Logger.Error( String.Format("Read from stream is error. Download file {0} {1}. Maybe Connection is lost.?? Error is {2} ", file.Title, file.ID, exception )); throw; } if (context.Response.IsClientConnected) { context.Response.OutputStream.Write(buffer, 0, length); context.Response.Flush(); flushed = true; dataToRead = dataToRead - length; } else { dataToRead = -1; Global.Logger.Warn(String.Format("IsClientConnected is false. Why? Download file {0} {1} Connection is lost. ", file.Title, file.ID)); } } } } catch (ThreadAbortException) { } catch (HttpException e) { throw new HttpException((int)HttpStatusCode.BadRequest, e.Message); } finally { if (fileStream != null) { fileStream.Close(); fileStream.Dispose(); } } try { context.Response.End(); flushed = true; } catch (HttpException) { } } } } catch (ThreadAbortException) { } catch (Exception ex) { // Get stack trace for the exception with source file information var st = new StackTrace(ex, true); // Get the top stack frame var frame = st.GetFrame(0); // Get the line number from the stack frame var line = frame.GetFileLineNumber(); Global.Logger.ErrorFormat("Url: {0} {1} IsClientConnected:{2}, line number:{3} frame:{4}", context.Request.Url, ex, context.Response.IsClientConnected, line, frame); if (!flushed && context.Response.IsClientConnected) { context.Response.StatusCode = 400; context.Response.Write(HttpUtility.HtmlEncode(ex.Message)); } } }
private static void DownloadFile(HttpContext context, bool inline) { if (!string.IsNullOrEmpty(context.Request[CommonLinkUtility.TryParam])) { DownloadTry(context); return; } try { var id = context.Request[CommonLinkUtility.FileId]; var shareLinkKey = context.Request[CommonLinkUtility.DocShareKey] ?? ""; using (var fileDao = Global.DaoFactory.GetFileDao()) { File file; var checkLink = FileShareLink.Check(shareLinkKey, true, fileDao, out file); if (!checkLink && file == null) { int version; file = int.TryParse(context.Request[CommonLinkUtility.Version], out version) && version > 0 ? fileDao.GetFile(id, version) : fileDao.GetFile(id); } if (file == null) { context.Response.Redirect("~/404.htm"); return; } if (!checkLink && !Global.GetFilesSecurity().CanRead(file)) { context.Response.Redirect((context.Request.UrlReferrer != null ? context.Request.UrlReferrer.ToString() : PathProvider.StartURL) + "#" + UrlConstant.Error + "/" + HttpUtility.UrlEncode(FilesCommonResource.ErrorMassage_SecurityException_ReadFile)); return; } if (!fileDao.IsExistOnStorage(file)) { Global.Logger.ErrorFormat("Download file error. File is not exist on storage. File id: {0}.", file.ID); context.Response.Redirect("~/404.htm"); return; } FileMarker.RemoveMarkAsNew(file); context.Response.Clear(); context.Response.ContentType = MimeMapping.GetMimeMapping(file.Title); context.Response.Charset = "utf-8"; var browser = context.Request.Browser.Browser; var title = file.Title.Replace(',', '_'); var ext = FileUtility.GetFileExtension(file.Title); var outType = string.Empty; var curQuota = TenantExtra.GetTenantQuota(); if (curQuota.DocsEdition || FileUtility.InternalExtension.Values.Contains(ext)) { outType = context.Request[CommonLinkUtility.OutType]; } if (!string.IsNullOrEmpty(outType) && !inline) { outType = outType.Trim(); if (FileUtility.ExtsConvertible[ext].Contains(outType)) { ext = outType; title = FileUtility.ReplaceFileExtension(title, ext); } } context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(title, inline)); if (inline && string.Equals(context.Request.Headers["If-None-Match"], GetEtag(file))) { //Its cached. Reply 304 context.Response.StatusCode = (int)HttpStatusCode.NotModified; context.Response.Cache.SetETag(GetEtag(file)); } else { context.Response.CacheControl = "public"; context.Response.Cache.SetETag(GetEtag(file)); context.Response.Cache.SetCacheability(HttpCacheability.Public); Stream fileStream = null; try { if (file.ContentLength <= SetupInfo.AvailableFileSize) { if (file.ConvertedType == null && (string.IsNullOrEmpty(outType) || inline)) { context.Response.AddHeader("Content-Length", file.ContentLength.ToString(CultureInfo.InvariantCulture)); if (fileDao.IsSupportedPreSignedUri(file)) { context.Response.Redirect(fileDao.GetPreSignedUri(file, TimeSpan.FromHours(1)).ToString(), true); return; } fileStream = fileDao.GetFileStream(file); } else { fileStream = FileConverter.Exec(file, ext); } fileStream.StreamCopyTo(context.Response.OutputStream); if (!context.Response.IsClientConnected) { Global.Logger.Error(String.Format("Download file error {0} {1} Connection is lost. Too long to buffer the file", file.Title, file.ID)); } context.Response.Flush(); } else { long offset = 0; if (context.Request.Headers["Range"] != null) { context.Response.StatusCode = 206; var range = context.Request.Headers["Range"].Split(new[] { '=', '-' }); offset = Convert.ToInt64(range[1]); } if (offset > 0) { Global.Logger.Info("Starting file download offset is " + offset); } context.Response.AddHeader("Connection", "Keep-Alive"); context.Response.AddHeader("Accept-Ranges", "bytes"); if (offset > 0) { context.Response.AddHeader("Content-Range", String.Format(" bytes {0}-{1}/{2}", offset, file.ContentLength - 1, file.ContentLength)); } var dataToRead = file.ContentLength; const int bufferSize = 1024; var buffer = new Byte[bufferSize]; if (file.ConvertedType == null && (string.IsNullOrEmpty(outType) || inline)) { if (fileDao.IsSupportedPreSignedUri(file)) { context.Response.Redirect(fileDao.GetPreSignedUri(file, TimeSpan.FromHours(1)).ToString(), true); return; } fileStream = fileDao.GetFileStream(file, offset); context.Response.AddHeader("Content-Length", (file.ContentLength - offset).ToString(CultureInfo.InvariantCulture)); } else { fileStream = FileConverter.Exec(file, ext); if (offset > 0) { var startBytes = offset; while (startBytes > 0) { long readCount; if (bufferSize >= startBytes) { readCount = startBytes; } else { readCount = bufferSize; } var length = fileStream.Read(buffer, 0, (int)readCount); startBytes -= length; } } } while (dataToRead > 0) { int length; try { length = fileStream.Read(buffer, 0, bufferSize); } catch (HttpException exception) { Global.Logger.Error( String.Format("Read from stream is error. Download file {0} {1}. Maybe Connection is lost.?? Error is {2} ", file.Title, file.ID, exception )); throw; } if (context.Response.IsClientConnected) { context.Response.OutputStream.Write(buffer, 0, length); dataToRead = dataToRead - length; } else { dataToRead = -1; Global.Logger.Error(String.Format("IsClientConnected is false. Why? Download file {0} {1} Connection is lost. ", file.Title, file.ID)); } } } } catch (HttpException e) { throw new HttpException((int)HttpStatusCode.BadRequest, e.Message); } finally { if (fileStream != null) { fileStream.Flush(); fileStream.Close(); fileStream.Dispose(); } } try { context.Response.End(); } catch (HttpException) { } } } } catch (Exception ex) { // Get stack trace for the exception with source file information var st = new StackTrace(ex, true); // Get the top stack frame var frame = st.GetFrame(0); // Get the line number from the stack frame var line = frame.GetFileLineNumber(); Global.Logger.ErrorFormat("Url: {0} {1} IsClientConnected:{2}, line number:{3} frame:{4}", context.Request.Url, ex, context.Response.IsClientConnected, line, frame); context.Response.StatusCode = 400; context.Response.Write(HttpUtility.HtmlEncode(ex.Message)); } }
private static void StreamFile(HttpContext context) { try { using (var fileDao = Global.DaoFactory.GetFileDao()) { var id = context.Request[FilesLinkUtility.FileId]; int version; if (!int.TryParse(context.Request[FilesLinkUtility.Version] ?? "", out version)) { version = 0; } var doc = context.Request[FilesLinkUtility.DocShareKey]; fileDao.InvalidateCache(id); File file; var linkRight = FileShareLink.Check(doc, fileDao, out file); if (linkRight == FileShare.Restrict && !SecurityContext.IsAuthenticated) { var auth = context.Request[FilesLinkUtility.AuthKey]; var validateResult = EmailValidationKeyProvider.ValidateEmailKey(id + version, auth ?? "", Global.StreamUrlExpire); if (validateResult != EmailValidationKeyProvider.ValidationResult.Ok) { var exc = new HttpException((int)HttpStatusCode.Forbidden, FilesCommonResource.ErrorMassage_SecurityException); Global.Logger.Error(string.Format("{0} {1}: {2}", FilesLinkUtility.AuthKey, validateResult, context.Request.Url), exc); context.Response.StatusCode = (int)HttpStatusCode.Forbidden; context.Response.Write(FilesCommonResource.ErrorMassage_SecurityException); return; } if (!string.IsNullOrEmpty(FileUtility.SignatureSecret)) { try { var header = context.Request.Headers[FileUtility.SignatureHeader]; if (string.IsNullOrEmpty(header) || !header.StartsWith("Bearer ")) { throw new Exception("Invalid header " + header); } header = header.Substring("Bearer ".Length); JsonWebToken.JsonSerializer = new DocumentService.JwtSerializer(); var stringPayload = JsonWebToken.Decode(header, FileUtility.SignatureSecret); Global.Logger.Debug("DocService StreamFile payload: " + stringPayload); //var data = JObject.Parse(stringPayload); //if (data == null) //{ // throw new ArgumentException("DocService StreamFile header is incorrect"); //} //var signedStringUrl = data["url"] ?? (data["payload"] != null ? data["payload"]["url"] : null); //if (signedStringUrl == null) //{ // throw new ArgumentException("DocService StreamFile header url is incorrect"); //} //var signedUrl = new Uri(signedStringUrl.ToString()); //var signedQuery = signedUrl.Query; //if (!context.Request.Url.Query.Equals(signedQuery)) //{ // throw new SecurityException(string.Format("DocService StreamFile header id not equals: {0} and {1}", context.Request.Url.Query, signedQuery)); //} } catch (Exception ex) { Global.Logger.Error("Download stream header " + context.Request.Url, ex); context.Response.StatusCode = (int)HttpStatusCode.Forbidden; context.Response.Write(FilesCommonResource.ErrorMassage_SecurityException); return; } } } if (file == null || version > 0 && file.Version != version) { file = version > 0 ? fileDao.GetFile(id, version) : fileDao.GetFile(id); } if (file == null) { context.Response.StatusCode = (int)HttpStatusCode.NotFound; return; } if (linkRight == FileShare.Restrict && SecurityContext.IsAuthenticated && !Global.GetFilesSecurity().CanRead(file)) { context.Response.StatusCode = (int)HttpStatusCode.Forbidden; return; } if (!string.IsNullOrEmpty(file.Error)) { context.Response.StatusDescription = file.Error; context.Response.StatusCode = (int)HttpStatusCode.BadRequest; return; } context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(file.Title)); context.Response.ContentType = MimeMapping.GetMimeMapping(file.Title); using (var stream = fileDao.GetFileStream(file)) { context.Response.AddHeader("Content-Length", stream.CanSeek ? stream.Length.ToString(CultureInfo.InvariantCulture) : file.ContentLength.ToString(CultureInfo.InvariantCulture)); stream.StreamCopyTo(context.Response.OutputStream); } } } catch (Exception ex) { Global.Logger.Error("Error for: " + context.Request.Url, ex); context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.Write(ex.Message); return; } try { context.Response.Flush(); context.Response.SuppressContent = true; context.ApplicationInstance.CompleteRequest(); } catch (HttpException he) { Global.Logger.ErrorFormat("StreamFile", he); } }
public FileUploadResult ProcessUpload(HttpContext context) { if (context.Request.Files.Count == 0) { return(Error("No files.")); } var file = context.Request.Files[0]; if (file.ContentLength <= 0 || file.ContentLength > maxFileSize) { return(Error("File size must be greater than 0 and less than {0} bytes", maxFileSize)); } try { var path = file.FileName; AudioType audioType; if (Enum.TryParse(context.Request["audioType"], true, out audioType)) { path = Path.Combine(audioType.ToString().ToLower(), path); } var uri = Global.GetStore().Save("voip", path, file.InputStream, MimeMapping.GetMimeMapping(file.FileName), ContentDispositionUtil.GetHeaderValue(file.FileName, withoutBase: true)); return(Success(new VoipUpload { AudioType = audioType, Name = file.FileName, Path = CommonLinkUtility.GetFullAbsolutePath(uri.ToString()) })); } catch (Exception error) { return(Error(error.Message)); } }
private static void EmptyFile(HttpContext context) { try { var fileName = context.Request[FilesLinkUtility.FileTitle]; if (!string.IsNullOrEmpty(FileUtility.SignatureSecret)) { try { var header = context.Request.Headers[FileUtility.SignatureHeader]; if (string.IsNullOrEmpty(header) || !header.StartsWith("Bearer ")) { throw new Exception("Invalid header " + header); } header = header.Substring("Bearer ".Length); JsonWebToken.JsonSerializer = new DocumentService.JwtSerializer(); var stringPayload = JsonWebToken.Decode(header, FileUtility.SignatureSecret); Global.Logger.Debug("DocService EmptyFile payload: " + stringPayload); //var data = JObject.Parse(stringPayload); //if (data == null) //{ // throw new ArgumentException("DocService EmptyFile header is incorrect"); //} //var signedStringUrl = data["url"] ?? (data["payload"] != null ? data["payload"]["url"] : null); //if (signedStringUrl == null) //{ // throw new ArgumentException("DocService EmptyFile header url is incorrect"); //} //var signedUrl = new Uri(signedStringUrl.ToString()); //var signedQuery = signedUrl.Query; //if (!context.Request.Url.Query.Equals(signedQuery)) //{ // throw new SecurityException(string.Format("DocService EmptyFile header id not equals: {0} and {1}", context.Request.Url.Query, signedQuery)); //} } catch (Exception ex) { Global.Logger.Error("Download stream header " + context.Request.Url, ex); context.Response.StatusCode = (int)HttpStatusCode.Forbidden; context.Response.Write(FilesCommonResource.ErrorMassage_SecurityException); return; } } var toExtension = FileUtility.GetFileExtension(fileName); var fileExtension = FileUtility.GetInternalExtension(toExtension); fileName = "new" + fileExtension; var path = FileConstant.NewDocPath + (CoreContext.Configuration.CustomMode ? "ru-RU/" : "default/") + fileName; var storeTemplate = Global.GetStoreTemplate(); if (!storeTemplate.IsFile("", path)) { context.Response.StatusCode = (int)HttpStatusCode.NotFound; context.Response.Write(FilesCommonResource.ErrorMassage_FileNotFound); return; } context.Response.AddHeader("Content-Disposition", ContentDispositionUtil.GetHeaderValue(fileName)); context.Response.ContentType = MimeMapping.GetMimeMapping(fileName); using (var stream = storeTemplate.GetReadStream("", path)) { context.Response.AddHeader("Content-Length", stream.CanSeek ? stream.Length.ToString(CultureInfo.InvariantCulture) : storeTemplate.GetFileSize("", path).ToString(CultureInfo.InvariantCulture)); stream.StreamCopyTo(context.Response.OutputStream); } } catch (Exception ex) { Global.Logger.Error("Error for: " + context.Request.Url, ex); context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.Write(ex.Message); return; } try { context.Response.Flush(); context.Response.SuppressContent = true; context.ApplicationInstance.CompleteRequest(); } catch (HttpException he) { Global.Logger.ErrorFormat("EmptyFile", he); } }