Пример #1
0
 public Document(Revision file)
     : this()
 {
     // ReSharper disable DoNotCallOverridableMethodsInConstructor
     GUID = Guid.NewGuid();
     Revisions.Add(file);
     Created = DateTime.Now;
     file.ParentDocument = this;
     // ReSharper restore DoNotCallOverridableMethodsInConstructor
 }
        public ActionResult _CreateDocuments(DocumentContainer entityKind, int id)
        {
            if (Request.Files.Count == 0)
                return HTTPStatus(HttpStatusCode.BadRequest, "Es wurden keine Dateien empfangen.");

            if (id <= 0)
                return HTTPStatus(HttpStatusCode.BadRequest, "Die Dateien können keinem Ziel zugeordnet werden.");

            Topic topic = null;
            if (entityKind == DocumentContainer.Topic)
            {
                topic = db.Topics.Find(id);

                if (IsTopicLocked(id))
                    return HTTPStatus(HttpStatusCode.Forbidden, "Da das Thema gesperrt ist, können Sie keine Dateien hochladen.");

                if (topic.IsReadOnly)
                {
                    return HTTPStatus(HttpStatusCode.Forbidden,
                        "Da das Thema schreibgeschützt ist, können Sie keine Dateien bearbeiten.");
                }
            }

            var statusMessage = new StringBuilder();
            int successful = 0;

            for (int i = 0; i < Request.Files.Count; i++)
            {
                HttpPostedFileBase file = Request.Files[i];

                if (file == null)
                    continue;

                if (string.IsNullOrWhiteSpace(file.FileName))
                {
                    statusMessage.AppendLine("Eine Datei hat einen ungültigen Dateinamen.");
                    continue;
                }
                string fullName = Path.GetFileName(file.FileName);
                if (file.ContentLength == 0)
                {
                    statusMessage.AppendFormat("Datei \"{0}\" hat keinen Inhalt.", fullName).AppendLine();
                    continue;
                }

                string filename = Path.GetFileNameWithoutExtension(file.FileName);
                string fileext = Path.GetExtension(file.FileName);
                if (!string.IsNullOrEmpty(fileext))
                    fileext = fileext.Substring(1);

                var revision = new Revision
                {
                    SafeName = InvalidChars.Replace(filename, ""),
                    FileSize = file.ContentLength,
                    UploaderID = GetCurrentUserID(),
                    Extension = fileext,
                    GUID = Guid.NewGuid(),
                    Created = DateTime.Now
                };

                Document document = new Document(revision)
                {
                    Deleted = null,
                    DisplayName = fullName
                };

                switch (entityKind)
                {
                    case DocumentContainer.Topic:
                        document.TopicID = id;
                        break;
                    case DocumentContainer.EmployeePresentation:
                        document.EmployeePresentationID = id;
                        break;
                    default:
                        throw new InvalidEnumArgumentException("entityKind", (int)entityKind, typeof(DocumentContainer));
                }

                try
                {
                    db.Documents.Add(document);
                    db.SaveChanges(); // Damit die Revision die ID bekommt. Diese wird anschließend im Dateinamen hinterlegt
                    document.LatestRevision = revision;
                    db.SaveChanges();
                    string path = Path.Combine(Serverpath, revision.FileName);
                    file.SaveAs(path);
                    successful++;
                }
                catch (DbEntityValidationException ex)
                {
                    var message = ErrorMessageFromException(ex);
                    statusMessage.AppendFormat("Datei \"{0}\" konnte nicht in der Datenbank gespeichert werden.\n{1}", fullName,
                        message)
                        .AppendLine();
                }
                catch (IOException)
                {
                    statusMessage.AppendFormat("Datei \"{0}\" konnte nicht gespeichert werden.", fullName).AppendLine();
                }
            }
            statusMessage.AppendFormat(
                successful == 1 ? "Eine Datei wurde erfolgreich verarbeitet." : "{0} Dateien wurden erfolgreich verarbeitet.",
                successful);

            // Ungelesen-Markierung aktualisieren
            if (topic != null && successful > 0)
                MarkAsUnread(topic);

            ViewBag.StatusMessage = statusMessage.ToString();

            return _List(id, entityKind);
        }
        public ActionResult CreateNewRevision(int id)
        {
            if (Request.Files.Count != 1)
                return HTTPStatus(HttpStatusCode.BadRequest, "Keine Datei empfangen");

            var file = Request.Files[0];
            if (file == null)
                return HTTPStatus(HttpStatusCode.BadRequest, "Keine Datei empfangen");

            // Checks
            Document document;
            Topic topic;
            var actionResult = CheckConstraints(id, out topic, out document);
            if (actionResult != null)
                return actionResult;
            //---------------------------------------------------------------

            if (string.IsNullOrWhiteSpace(file.FileName))
                return HTTPStatus(HttpStatusCode.BadRequest, "Die Datei hat einen ungültigen Dateinamen.");

            var fullName = Path.GetFileName(file.FileName);
            if (file.ContentLength == 0)
                return HTTPStatus(HttpStatusCode.BadRequest, "Datei " + fullName + " hat keinen Inhalt.");

            string filename = Path.GetFileNameWithoutExtension(file.FileName);
            string fileext = Path.GetExtension(file.FileName);
            if (!string.IsNullOrEmpty(fileext))
                fileext = fileext.Substring(1);

            var revision = new Revision
            {
                ParentDocument = document,
                SafeName = InvalidChars.Replace(filename, ""),
                FileSize = file.ContentLength,
                UploaderID = GetCurrentUserID(),
                Extension = fileext,
                GUID = Guid.NewGuid(),
                Created = DateTime.Now
            };
            document.Revisions.Add(revision);
            document.LatestRevision = revision;
            document.DisplayName = fullName;

            try
            {
                db.SaveChanges(); // Damit die Revision seine ID bekommt. Diese wird anschließend im Dateinamen hinterlegt
                string path = Path.Combine(Serverpath, revision.FileName);
                file.SaveAs(path);
            }
            catch (DbEntityValidationException ex)
            {
                return HTTPStatus(HttpStatusCode.InternalServerError, ErrorMessageFromException(ex));
            }
            catch (IOException ex)
            {
                return HTTPStatus(HttpStatusCode.InternalServerError, "Dateisystemfehler: " + ex.Message);
            }

            // Ungelesen-Markierung aktualisieren
            if (topic != null)
                MarkAsUnread(topic);

            return HTTPStatus(HttpStatusCode.Created, Url.Action("Details", "Attachments", new {Area = "", id}));
        }
        /// <summary>
        ///    Beginnt die nahtlose Bearbeitung eines Dokuments. Hierzu wird die aktuelle Revision kopiert und dem Anwender werden
        ///    Schreibrechte eingeräumt. Nach Abschluss seiner Bearbeitung muss der Anwender speichern, um die neue Revision zur
        ///    aktuellen zu machen.
        /// </summary>
        /// <param name="id">Die ID des Dokuments, zu dem eine neue Revision erzeugt werden soll.</param>
        //[HttpPost]
        public ActionResult BeginNewRevision(int id)
        {
            // Checks
            Document document;
            Topic topic;
            var actionResult = CheckConstraints(id, out topic, out document);
            if (actionResult != null)
                return actionResult;

            if (!isInternetExplorer || !OfficeExtensions.Contains(document.LatestRevision.Extension))
                return HTTPStatus(HttpStatusCode.BadRequest, "Dieser Vorgang ist nur mit MSIE und Office-Dokumenten zulässig.");
            //---------------------------------------------------------------

            var now = DateTime.Now;

            document.LockUserID = GetCurrentUserID();
            document.LockTime = now;

            var revision = new Revision
            {
                ParentDocument = document,
                SafeName = document.LatestRevision.SafeName,
                FileSize = 0,
                UploaderID = GetCurrentUserID(),
                Extension = document.LatestRevision.Extension,
                GUID = Guid.NewGuid(),
                Created = now.AddMilliseconds(100)
            };
            document.Revisions.Add(revision);

            try
            {
                db.SaveChanges(); // Damit die Revision seine ID bekommt. Diese wird anschließend im Dateinamen hinterlegt
                var sourcePath = Path.Combine(Serverpath, document.LatestRevision.FileName);
                var destPath = Path.Combine(TemporaryServerpath, revision.FileName);
                System.IO.File.Copy(sourcePath, destPath);
            }
            catch (DbEntityValidationException ex)
            {
                return HTTPStatus(HttpStatusCode.InternalServerError, ErrorMessageFromException(ex));
            }
            catch (IOException ex)
            {
                return HTTPStatus(HttpStatusCode.InternalServerError, "Dateisystemfehler: " + ex.Message);
            }
            return HTTPStatus(HttpStatusCode.Created, "file://" + _hostname + "/Temp/" + revision.FileName);
        }