Autor |
Beitrag |
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Do 02.10.08 12:13
Hallo Liebe Community. =)
Ich habe ein großes Problem, an dem ich seid einigen Tagen verweifel.
Ich möchte eine Web-Anwendung in C# erstellen, die wie folgt aussieht:
Entwurf:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Video: [_________]Durchsuchen (File Upload) Button: load video
titel: ___ subtitel:___ . . .
Button: save as xml |
So. Das ganze soll nachher auf einen Server hochgepackt werden. Wenn ich es da als website öffne, soll ich in das Video-durchsuchen feld per load video eine avi-datei aussuchen können [klappt].
Dann zu dem video verschiedene infos in die felder titel, subtitel usw. reinschreiben[klappt].
Jez wirds schwierig: durch das drücken vom Button save as xml soll eine xml datei erzeugt werden mit den ganzen Infos drin.
Diese xml soll dann in genau den Ordner, indem auch die Avi-Datei, die beim FileUpload-Feld ausgewählt wurde, gespeichert werden.
Unter einem etwas abgewandelten Namen, es soll davor noch ein kürzel vor, aber das ist unwichtiger.
Jedenfalls: Wenn ich das in meiner Entwicklungsumgebung teste, funktioniert es. wenn ich es veröffentliche und lokal mit IIS versuche, klappt es nicht.
Wenn ich es auf dn besagten Server packe, klappt es, wenn sich die avi-datei ebenfalls auf dem server befindet. so soll es auch klappen. AABEr es klappt nicht, wenn ich von der servergeladenen seite was lokal, also zB unter C:// machen will. -.-
Ich schreib hie jez nochwas Code zu, aber bitte habt verständniss, das ich nicht alles mitsenden kann. Einmal, weil das zu viel ist. einmal aus datenschutzgründen und drittens hoffe ich auch, den Fehler gut genug lokalisieren zu können sodass ich ncihts unwichtiges weglasse.
Ich hoffe sehr, ihr könnt mir helfen denn ich bin mittlerweile nurnoch auf einer Stelle.
Übrigens: ich bekomme KEINERLEIH FEHLERMELDUNG! Und im Ereignissprotokoll wird auchnichts aufgeführt...
Ein weiteres Problem, das ich jetzt mal dazu erwähne weil es vielleicht im Zusammenhang steht: Wenn ich das Programm öfters ausführe, bekomme ich nach einer Zeit die Fehlermeldung:
Der Zugriff auf tempvideo wurde verweigert, weil ein anderer Prozess drauf zugreift. tempvideo ist eine kopie des videos, das in einem tempordner erstellt wird, vondem einige infos dann herausgezogen werden. Frag mich nicht warum, das projekt habe ich so in die Hände bekommen.
Sorry das ich soviel geschrieben habe, aber es ist wirklich etwas komplex alles.. ich hoffe, ich habe nichts vergessen.
Hier also nun der Code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161:
| using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Text.RegularExpressions; using System.Drawing.Imaging; using System.IO; using AviFile;
. . .
protected void btnLoadVideo_Click(object sender, EventArgs e) {
char[] endChars = { '.', 'a', 'v', 'i' }; char[] startChars = { 'C', ':', '\\' }; if (FileUploadVideo.HasFile) {
if (FileUploadVideo.PostedFile.ContentType == "video/avi") {
fehler.Visible = true; fehler.Text = "Loading was successfull!"; fehler.ForeColor = System.Drawing.Color.Black;
FileUploadVideo.SaveAs(Server.MapPath("Videos/" + "tempVideo.avi")); lblVideoInfo.Text = Convert.ToString(FileUploadVideo.PostedFile.ContentLength); lblVideoInfo2.Text = FileUploadVideo.FileName.TrimEnd(endChars).TrimStart(startChars); lblVideoInfo3.Text = FileUploadVideo.PostedFile.FileName.TrimEnd(endChars); }
else { fehler.Text = "Can't upload, this file is not in the .avi-format!"; fehler.ForeColor = System.Drawing.Color.Red; fehler.Visible = true; }
}
else { fehler.Text = "Can't upload, please check the Filepath!"; fehler.ForeColor = System.Drawing.Color.Red; fehler.Visible = true; }
}
private void generateXml() { string videoTitle = txtTitle.Text; string subtitle = txtSubtitle.Text; string streamID = lblVideoInfo2.Text; string pathname = lblVideoInfo3.Text; string catid = DropDownList1.SelectedItem.Value; string actionid = drdlaction.SelectedItem.Value; int videoSize = Convert.ToInt32(lblVideoInfo.Text); DateTime actualDate = System.DateTime.Now; string date = string.Format("{0:u}", actualDate); double videoLength;
AVIReader avi = new AVIReader(); VideoStream tempStream = avi.getStreamInfo(Server.MapPath("Videos/" + "tempVideo.avi")); try { lblVideoInfo.Text = "" + tempStream.Width + "" + tempStream.Height + tempStream.CountFrames;
videoLength = (tempStream.CountFrames / (tempStream.FrameRate * 60));
XmlParser app = new XmlParser();
double ts = videoLength * 60; int tm = 0; string tmp; while (ts >= 60) { ts = ts - 60; tm = tm + 1; }
BLA BLA.. HIER HAB ICH WAS HERAUSGESCHNITTEN WEIL DIE ROUTINE SO LANGE IST. HIER WIRD DIE FRAMEZEIT IN MINUTEN UMGERECHNET.
}
int laenge = lblVideoInfo2.Text.Length; int pathlaenge = pathname.Length; int pathcuttedlaenge = pathlaenge - laenge; string pathnamecutted = pathname.Substring(0, pathcuttedlaenge);
app.makeXml(videoTitle, subtitle, catid, "901_" + streamID, tmp, videoSize, date, actionid, pathnamecutted); test.Text = pathnamecutted + "901_" + streamID + ".xml"; } catch { tempStream.Close(); KLAPPT NICHT HAB ICH GESCHRIEBEN WEIL ICH DACHTE, DER PROZESSVERWEIGERUNGSFEHLER LIEGT DARAN WEIL AVI NET RICHTIG GESCHLOSSEN WIRD fehler.Visible = true; fehler.Text = "Can't Save. There is a Problem with the tempVideo!"; fehler.ForeColor = System.Drawing.Color.Red; } }
protected void btnSaveXml_Click(object sender, EventArgs e) { if (lblVideoInfo3.Text != "") {
if (txtTitle.Text != "") { if (txtSubtitle.Text != "") {
fehler.Visible = true; fehler.Text = "Saving as XML was successfull!"; fehler.ForeColor = System.Drawing.Color.Black; generateXml(); else { fehler...
} } else { fehler... } } else { fehler... }
} } |
Bitte helft mir.
Mit freundlichen Grüßen,
Jonas Marx
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 02.10.08 12:32
Denk doch mal drüber nach: Glaubst du wirklich, du könntest bei jedem Besucher deiner Seite auf seiner Festplatte beliebige Dateien speichern? Du kannst die Xml-Datei höchstens zum Download anbieten, auf die HDD der Besuchers hast du verständlicherweise keinen Zugriff.
_________________ >λ=
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Do 02.10.08 12:39
Oh Sorry, ich denk da habsch vergessen zu sagen:
Das soll nicht für iwelche User sein
Das soll eig nur für naja.. mich oder wenn überhaupt bestimmte andere personen sein die das benutzen... und ich denke du willst auf Rechte hinaus, die sollten an sich gegeben sein.
Ich habe auchschon Tagelang an web.config und IIS und diversen Ordnern rumexperimentiert und mir so gut wie alle rechte die es gibt geholt xP
Falls du nicht darauf hinauswolltest, dann sollte ich aber viel nachdenken -.-
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Do 02.10.08 12:42
und 2tens: die xml soll doch variabel sein.. das heißt ich kann sie net zum download anbieten weil sie ja dann statisch wäre nach meinem verständnis.
Der pfad muss noch je nach hochgeladener avi-datei geändert bzw. deklariert werden!!!
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 02.10.08 14:51
Ob nur für Bekannte oder nicht - ich glaube nicht, dass das funktionieren wird, solange du nicht auf jedem Rechner ein Client-Programm ausführst. Und dann brauchst du wahrscheinlich auch keine Webseite mehr .
_________________ >λ=
|
|
Timosch
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: Do 02.10.08 15:02
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Do 02.10.08 15:03
Es muss aber funktionieren -.-
Ich bin Auszubildender Fachinformatiker Anwendungsentwicklung und das Programm ging vorher in anderer Abwandlung auch.
naja.. dennoch danke, ich werde das meinem Ausbilder nochmal unter die Nase binden..
Aber was bitte meinst du mit dem Client-Programm??
grüße, Jonas
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Do 02.10.08 15:44
Zitat: |
Wieso denn? Du erstellst sie dynamisch und stellst sie zum Download bereit. Aber einfach speichern geht nicht (ActiveX und solche Sachen mal außen vor gelassen). Überleg doch nur mal, was passieren würde, wenn das ginge! |
Hm.. aber wenn ich sie zum Download bereitstelle, wäre das erstens mehr Arbeit für den Anwender, weil er dann daernd auf Speichern klicken müsste. Zweitens ist das nicht im Sinne meines Auftrages. (die hässlichkeit mal außen vorgelassen)^^
Desweiteren ist mir schon bewusst, das eine Website nicht einfach das recht haben sollte, alles mögliche auf die Festplatte einfach draufzuhauen, das ist mir schon klar.
Aber wie bereits erwähnt lief eine ähnliche Anwendungs schonmal bei uns. Ich glaube, da war das ganze nur statisch also der Videoherkunftspfad oder sowass.
Außerdem funktioniert das ganze ja schon Stellenweise. So kann man wie gesagt vom Server zu Server ohne Probleme speichern, wenn man alles richtig einstellt. Und das wäre im engeren Sinne auchnicht Sicher.
Als letztes möchte ich noch erwähnen, das ich keinesfalls arbeitsfaul, sondern mittlerweile durch das ständige Suchen nach Fehlern eher abgestumpft bin.
Ich hab den Code so oft durchlesen und ausprobiert..
Es hat einfach nichts gebracht. Dazu muss ich sagen, das ich nochnicht lange in C# unterwegs bin. Ich hab allerdings Erfahrung aus anderen Programmiersprachen bzw. der Struktur.
Grüße, Jonas
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 02.10.08 22:36
Ich weiß nicht, wie du die Datei speicherst (diese einzige wichtige Zeile hast du leider weggelassen ), aber die üblichen Methoden wie XmlDocument.Save können auf jeden Fall nur im Intranet speichern!. Das hast nicht einmal direkt etwas mit Rechten zu tun. Ohne FTP oder Ähnliches (und dazu brauchts eben auch beim Benutzer ein Programm = Client-Programm) kann das nicht funktionieren.
_________________ >λ=
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 06.10.08 09:33
Hallo Kha.
ja, ich speichere mit:
xmlDoc.Save(applicationPath + streamID + ".xml");
"applicationPath" soll der Ordnerpfad sein also zb "C:/programme/gedöns/"
"streamID" ist der umgewandelte dateiname, zb "123_4478910"
und dann halt ".xml".
Erstmal danke für die Hilfe..
Ich muss dann wohl meinen Ausbilder nochmal fragen, ob er mir helfen kann..
Bis bald, Jonny
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 06.10.08 10:25
Hallo Jonny,
nach dem ganzen Hin und Her und der jetzigen konkreten Aussage wäre es schön, wenn Du nochmals Dein Problem konkret benennen könntest; dann können vielleicht auch wir helfen.
An Deinen letzten Aussagen fällt mir folgendes auf:
- streamID ist doch wohl eine Zahl. Wenn Du diese in einem String verknüpfen willst, musst Du streamID.ToString() verwenden.
- Zum Zusammensetzen eines Dateinamens ist vorzugsweise Path.Combine() zu verwenden. Das steuert Probleme mit dem Backslash automatisch.
- Im Applikationspfad sollten solche Dateien nicht gespeichert werden. (Unter Vista hat der normale Nutzer auch keine Schreibrechte dafür.) Dafür hat Windows Application.CommonAppDataPath vorgesehen.
Gruß Jürgen
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 06.10.08 14:10
@JüTho:
Hm.. wie soll ich denn noch konkreter werden?
Also genauer als am anfang kann ich doch nicht werden -.-
Mein Problem ist, das wenn ich auf den Button saveXML drücke, er nicht speichert, solange ich vom Intranet auf einen PC unserer Firma speichern will.
Von Intranet aufs Intranet funktioniert es, von der Visual Studio 2005 entwicklungsumgebung auch.
Wer jez nicht weiß was ich meine.. dann habe ich in meinem ersten Eintrag wohl zu schlecht erklärt, aber es ist auchnicht einfach zu erklären zu meienr Verteidigung^^
streamID müsste zwischendurch zu einem String gemacht worden sein, ich schau gleich nochmal nach. streamID enthält zwar eine Zahl, soll aber, um in den Dateinamen reinimplementiert zu werden, eine stringvariable.
Path.Combine werde ich auchmal ausprobieren.
UND: ich will ja nicht in den Applicationspfad :'(
Drücke ich mich undeutlich aus? Ich will nicht in das verzeichnis, indem die website oder was auch imemr liegt und auchnicht in den projektordner.
Sorry das ich mich etwas aufrege aber iwie wollen mir alle den applikationspfad unterjubeln, und der dürfte nach meinem Verständniss einfach nicht das sein, was ich suche.
Ich will den pfad, der auf das Video zeigt, das der User mittels des FileUpload-feldes ausgewählt hat.
So, der kann also unter:
C:/Programme/MeineTollenVideos/123456.avi
liegen oder
MeinServer/eintollerOrdner/1234/5678/90.avi
liegen.
so, dieser pfad, da wird dann das .avi weggehauen.
also: C:/Programme/MeineTollenVideos/123456
dann wird der dateiname genommen und abgeändert:
123456 --> 901_123456
dann will ich die ganzen Infos, die in den anderen Textfeldern stehen, in eine .xml hauen, die da lautet:
C:/Programme/MeineTollenVideos/901_123456.xml
das wäre mein Plan.
Folgendes passiert:
Wenn ich wie gesagt von server auf festplatte das klatschen will, dann läuft der code flüssig durch. die .xml datei wird aber einfach nicht gespeichert! EDIT: bzw. erstellt. Der Pfad sollte nach meinem verständniss richtig sein... (ich hoffe es, ich versuch gleichnochmal, obs vllt an dem fehlenden combine.Path liegt).
und eine Fehlermeldung kriege ich nirgendswo zu keiner zeit, auchnicht im debugging.
Ein weiterer Bug ist, das mir nach einer Weile beim laden einer avi angezeigt wird, das der prozess nicht auf tempVideo.avi zugreifen kann, weil dieser in Benutzung sei. (tempVideo.avi ist eine avi datei im projekt ordner, unter der die geladenen avis immer abgespeichert werden). Ich vermute, das da irgendein Stream nicht richtig geclosed wird, aber auch da komme ich nicht weiter, da ich wzar ne fehlermeldung bekomme, aber halt nur manchmal. und wenn ich den stream am ende der funktion close, dann kriege ich "Prozess kann nicht in schreibgeschützte dateien schreiben, sodass ich vermute das der stream zu früh geclosed wurde, obwohl die funktion danach zu ende ist -.-
es ist zum verzweifeln..
Ich hoffe, ihr könnt mir helfen,
grüße Jonny
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 06.10.08 14:34
Tut mir leid, wenn ich Deinen Unmut hervorgerufen habe: Mir war nach Deinem (jetzt vor-) letzten Beitrag nicht mehr klar, inwieweit das Problem mit dem Hinweis auf applicationPath gelöst war und ob Du Dich mit dem Hinweis auf den Ausbilder darüber beklagen wolltest, dass Du von uns keine Hilfe bekommst. Ich wäre mit einem kurzen Hinweis zufrieden gewesen. Jürgen
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 06.10.08 14:38
Hey, also:
streamID ist ein string
und:
path.Combine versteh ich nicht, bei mir wird dann garnichtsmehr gespeichert..
aber weiß auchnicht, ob ich das so richtig gemacht habe:
C#-Quelltext 1: 2: 3:
| String pfadkombiniert2 = System.IO.Path.Combine(applicationPath, streamID); String pfadkombiniert = System.IO.Path.Combine(pfadkombiniert2, ".xml"); xmlDoc.Save(pfadkombiniert); |
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 06.10.08 15:32
So geht Path.Combine:
C#-Quelltext 1:
| string filename = Path.Combine(applicationPath, streamID + ".xml"); |
Zuerst den Pfadnamen (mit oder ohne Backslash - das ist völlig egal), dahinter den kompletten Dateinamen ohne Pfad.
Dein Versuch liefert ein Ergebnis etwa so:
Quelltext 1:
| "C:\Programme\MyProgram\12345\.xml" |
Gruß Jürgen
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 06.10.08 16:47
hey JöTho.
ich habe Path.Combine nun eingefügt und es klappt.
Leider hilft mir das bei meinen bisherigen Problemen immernochnicht weiter, d.h. die bestehen weiterhin.
grüße, Jonas
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Mi 08.10.08 09:09
Ich habe das ganze jetzt nochmal mit meinem Ausbilder besprochen.
Es wäre auch okay, wenn ich statt dem xml.Save einen PopUp Dialog a la "Speichern unter" einsetze. wo man dann praktisch auf speichern klickt, das PopUp öffnet sich und da, wo man dann auswählt, wird das xml abgespeichert. ich soll das irgendwie clientseitig per Response.Redirect lösen, doch ich weiß nicht, wie ich das schreiben soll bzw. wie ich das halt machen soll... Weil die Funktion mit dem Buttonklick "speichern" verweißt dann auf eine ausgelagerte Funktion (ich meine so einen App_Code) so wie ich das verstanden habe, den Xml-parser. Dieser speichert das dann.
ich finde aber keine gute beschreibung für response.redirect..
bzw. da steht, das man dahinter in klammern eine url angeben soll. diese soll aber doch vom benutzer frei ausgewählt werden?? ich denke, das response.redirect löst das PopUp aus???
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: Do 09.10.08 11:12
Okay Leute, hab es soweit ganz gut hinbekommen...
für die, die ein ähnliches Problem haben:
ich habe die xml per xmlDoc.Save abgespeichert in den Projektordner.
Dann wird ein response.Redirect ausgeführt, das auf diese xml zeigt.
Nur leider öffnet sich dann nicht wie gewollt ein Download-PopUp, sondern die Xml
wird aufgerufen.
Naja, vielleicht (bzw. hoffentlich) bekomme ich das noch in den Griff..
Grüße, Jonas
-Kann geclosed werden-
|
|
Xardas008
Beiträge: 149
Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
|
Verfasst: Di 21.10.08 21:46
Hallo jmarx,
schön dass du es soweit hinbekommen hast.
Zu deinem Quellcode den du oben gepostet hast.
Du versuchst in dem Catch-Block deinen Stream zu schließen. Ich würde dir empfehlen, dieses im finally zu machen, da dies dann auf jedenfall ausgeführt wird.
Dadurch verhinderst du, dass der Stream unabsichtlich geöffnet bleibt, solltest du die Methode verlassen und nochmals betreten.
Dadurch dürfte meiner Meinung nach dein Problem mit der Fehlermeldung bzgl. der Zugriffsverletzung behoben sein.
Was das Pop-Up betrifft, schau doch mal in die MSDN Hilfe nach download.
Dort wird das so gemacht, dass die einen Hyperlink auf irgendwas setzen. Da du ja festlegen kannst, wo du die XML-Datei auf dem Server temporär ablegen kannst, wäre es somit möglich, den Hyperlink auf eben diese Datei zu setzen. Diesen könntest du zur laufzeit erzeugen, sobald du den speicherort kennst.
Du findest auf jedenfall ein Beispiel dazu in der MSDN-Hilfe.
Hoffe ich konnte dir hier helfen.
Gruß
|
|
jmarx
Hält's aus hier
Beiträge: 14
|
Verfasst: So 14.12.08 11:59
Vielen Dank auch hier =)
Das mit dem catch-Finally hätte ich gleich drauzf kommen können, vielen Dank, ds ist etwas was mir attsächlich immernoch gfehl hat an der Stelle..
Ja, das mit dem Download habe ich jetzt auch soweit hinbekommen und das programm ist fertig. =)
Vielen Dank auch hier nochmal,
Jonny
|
|
|