ASP.NET C# Mime-Type des Uploads ermitteln?

markusstrauss

Grünschnabel
hallo,

habe ein uploadskript das in etwa so aussieht:

PHP:
<script language="C#" runat="server">
void btnUploadTheFile_Click(object Source, EventArgs evArgs) 
{
  string strDomainNameAndDir = "http://domain.tdl/uploads/";
  string strFileNameOnServer = txtServername.Value;
  string strBaseLocation = "c:\\path\\to\\dir\\";
  
  
  if ("" == strFileNameOnServer) 
  {
    txtOutput.InnerHtml = "Bitte geben Sie den Dateinamen + Endung ein!";
    return;
  }

  if (null != uplTheFile.PostedFile) 
  {
    try 
    {
      uplTheFile.PostedFile.SaveAs(strBaseLocation+strFileNameOnServer);
      txtOutput.InnerHtml = "<br />Datei " + strFileNameOnServer + " erfolgreich hochgeladen!<br><br>Sie erreichen sie 

über diesen Link:<br /><a href=\"" + strDomainNameAndDir+strFileNameOnServer + "\" target=\"_blank\">" + 

strDomainNameAndDir+strFileNameOnServer + "</a>";
    }
    catch (Exception e) 
    {
      txtOutput.InnerHtml = "Fehler beim Speichern von <b>" + 
        strBaseLocation+strFileNameOnServer+"</b><br>"+ e.ToString();
    }
  }
}
</script>

<table>
<form enctype="multipart/form-data" runat="server" name="upload">
<tr>
  <td>Datei ausw&auml;hlen:</td>
  <td><input id="uplTheFile" type="file" runat="server"></td>
</tr>
<tr>
  <td>Name am Server:</td>
  <td><input id="txtServername" type="text" runat="server"></td>
</tr>
<tr>
  <td colspan="2">
  <input type=button id="btnUploadTheFile" value="Upload" 
                    onServerClick="btnUploadTheFile_Click" runat="server">
  </td>
</tr>
</form>
</table>
    
<span id="txtOutput" runat="server"></span>

möchte hier nun eine datei-beschränkung einbauen. dazu bräuchte ich den mime-type der hochgeladenen datei und wenn möglich auch noch die dateiendung!

wäre echt dankbar für nützliche tipps!


mfg
markus
 
Servus,


versuchs doch mal
Code:
uplTheFile.PostedFile.ContentType
für den MIME-type und
Code:
System.IO.Path.GetExtension(uplTheFile.PostedFile.FileName)
für die Endung.

Greetz, MF
 
hallo,

also der post von harass hat mir schon geholfen.

nun habe ich noch ein problem:

wie kann ich prüfen, ob ein eintrag in einem string-array existiert?

in php ging das ja so:

PHP:
<?php
$array = Array("windows", "linux", "mac");
if(in_array("linux", $array) {
echo "linux gefunden";
}
?>

gibt es so etwas in c# auch?


mfg
markus
 
Klar geht das:
Code:
String[] myArray = new String[] { "windows", "linux", "mac" };
bool isInArray = Array.IndexOf<String>(myArray, "linux") != -1;

Hth, Martin
 
danke! funktioniert bestens!

nun sehe ich gerade wieder ein problem ;)

hier nochmal mein jetziger code:

C:
<script language="C#" runat="server">
void btnUploadTheFile_Click(object Source, EventArgs evArgs) 
{
  string strDomainNameAndDir = "http://domain.tld/uploads/";
  string strFileNameOnServer = txtServername.Value;
  string strBaseLocation = "c:\\path\\to\\dir\\";
  string strMimeType = uplTheFile.PostedFile.ContentType;
  string strFileExtension = System.IO.Path.GetExtension(uplTheFile.PostedFile.FileName);

  string[] arMimeTypes = {"image/jpg","image/jpeg","image/pjpeg","image/gif","image/png"};
  string[] arFileExtensions = {".jpg",".jpeg",".gif",".png"};

  bool isInMimeArray = Array.IndexOf<String>(arMimeTypes, strMimeType) != -1;
  bool isInExtensionArray = Array.IndexOf<String>(arFileExtensions, strFileExtension) != -1;
  
  
  if (strFileNameOnServer == "") 
  {
    txtOutput.InnerHtml = "Bitte geben Sie den Dateinamen + Endung ein!";
    return;
  }

  if (isInExtensionArray && isInMimeArray)
  {
    

  if (System.IO.File.Exists(strBaseLocation+strFileNameOnServer))
  {
    txtOutput.InnerHtml = "<br />Der gewählte Dateiname existiert bereits!<br /><a href=\"/default.aspx\">Bitte 

hier klicken</a>";
    return;
  }

  if (uplTheFile.PostedFile != null) 
  {
    try 
    {
      uplTheFile.PostedFile.SaveAs(strBaseLocation+strFileNameOnServer);
      txtOutput.InnerHtml = "<br />Datei " + strFileNameOnServer + " erfolgreich hochgeladen!<br><br>Sie erreichen 

sie über diesen Link:<br /><a href=\"" + strDomainNameAndDir+strFileNameOnServer + "\" target=\"_blank\">" + 

strDomainNameAndDir+strFileNameOnServer + "</a>";

      mimeError.InnerHtml = "";
      extensionError.InnerHtml = "";
    }
    catch (Exception e) 
    {
      txtOutput.InnerHtml = "Fehler beim Speichern von <b>" + 
        strBaseLocation+strFileNameOnServer+"</b><br>"+ e.ToString();
    }
  }
}
else {
	if(!isInMimeArray)
	{
		mimeError.InnerHtml = "Die Datei weist einen falschen Mime-Type auf!";
	}

	if(!isInExtensionArray)
	{
		extensionError.InnerHtml = "Die Datei weist eine falsche Datei-Endung auf!";
	}
}
}
</script>

<table>
<form enctype="multipart/form-data" runat="server" name="upload">
<tr>
  <td>Datei ausw&auml;hlen:</td>
  <td><input id="uplTheFile" type="file" runat="server"></td>
</tr>
<tr>
  <td>Name am Server:</td>
  <td><input id="txtServername" type="text" runat="server"></td>
</tr>
<tr>
  <td colspan="2">
  <input type=button id="btnUploadTheFile" value="Upload" 
                    onServerClick="btnUploadTheFile_Click" runat="server">
  </td>
</tr>
</form>
</table>
    
<span id="txtOutput" runat="server"></span>

<span id="mimeError" runat="server"></span>

<span id="extensionError" runat="server"></span>

funktioniert auch, nur wenn eine datei erfolgreich hochgeladen wurde, funktioniert der submit - button nicht mehr; kommt eine fehlermeldung funktioniert er jedoch schon! :confused:

wie kann ich des nun anstellen, dass der button immer funktioniert?

mfg
markus
 
Zuletzt bearbeitet:
Hallo Markus,

ich würde dir ja gerne weiterhelfen, aber
funktioniert der submit - button nicht mehr
ist nicht sehr hilfreich.

Der Code sieht auf den ersten Blick doch eigentlich richtig aus.
Versuch einfach nochmal, das Poblem genauer zu schildern, indem du davon ausgehst, das keiner ne Ahnung hat, was du machen willst und auch (fast) keiner Lust hat sich (noch) mehr Quellcode durchzulesen, geschweige denn zu testen.

Gruß, Martin
 
ok, ...

also ich hab ja da dieses formular für den datei-upload

HTML:
<form enctype="multipart/form-data" runat="server" name="upload">
<tr>
  <td>Datei ausw&auml;hlen:</td>
  <td><input id="uplTheFile" type="file" runat="server"></td>
</tr>
<tr>
  <td>Name am Server:</td>
  <td><input id="txtServername" type="text" runat="server"></td>
</tr>
<tr>
  <td colspan="2">
  <input type=button id="btnUploadTheFile" value="Upload" 
                    onServerClick="btnUploadTheFile_Click" runat="server">
  </td>
</tr>
</form>

wenn ich die seite aufrufe, erscheint ganz normal das eingabeformular. ich wähle eine datei aus, gebe ihr einen namen und klicke auf "upload". dann erscheint die meldung, dass die datei erfolgreich hochgeladen wurde.

klicke ich jetzt wieder auf durchsuchen, wähle wieder eine datei aus, geb ihr wieder einen namen und klicke wieder auf upload. leider tut sich ab hier gar nichts mehr! ich kann so oft auf den button (mit der ID "btnUploadTheFile") klicken, es tut sich garnichts. rufe ich die seite neu auf, so funktioniert wieder alles ...

ist jetzt klar, was ich meine?

mfg
markus
 
Servus,

was du meinst ist jetzt klar, allerdings habe ich so direkt zu dem Problem keine Lösung zu Hand.

Ich empfehle dir mal nen Breakpoint an den Anfang des Eventhandlers zu setzen und das ganze Schritt für Schritt zu debuggen. Dann müsstest du eigentlich sehen, wo der Fehler liegt, bzw. ob der Klick überhaupt getriggert wird. Manchmal neigt das .NET-Framework zu komischen Dingen, finde ich :rolleyes:
 
hallo,

tja, die sache ist erstmal nebensächlich.

ein viel größeres problem ist: wie realisiere ich es, dass wen eine datei, die der user hochladen möchte bereits existiert, dieser automatisch eine fortlaufende nummer angehängt wird?

als erstes kam mir sowas in den sinn:

C:
if (uplTheFile.PostedFile != null)
{
  int counter = 0;
  while(System.IO.File.Exists(strBaseLocation+strFileNameOnServer))
  {
    strFileName = strFileName + counter.ToString();
    counter++;
  }

  try
  {
    // datei hochladen
  }
  catch(Exception e)
  {
    // fehlermeldung
  }
}

das problem ist hier jedoch, dass dann ja als dateiname sowas herauskommen würde:

  • test.jpg
  • test.jpg0
  • test.jpg1
  • test.jpg2

wie bekomme ich den dateinamen ohne die dateiendung heraus?


mfg
markus
 
Zurück