HttpWebRequest file upload problem

G

Guest

I am trying to code a file uploader (for forum/email attachments) from the
client computer to a remote web server via the PUT method (since POST is not
allowed [405 error]). However, the upload works ONLY when the file is inside
a shared folder on my computer. If I try to upload from any other folder it
does not work. Why is this?

Reason being that whenever I upload files on other forums or websites I know
I don't need to have my folder shared on my network. I just enter a path and
do it. Am I missing a setting on the remote server? Am I coding something
wrong? Please help. Here is my code:

// Upload the file to a web server using the HttpWebRequest object
string strAttachFile = "C:\temp\blah.txt";
HttpWebRequest myHttpWebRequest =
(HttpWebRequest)WebRequest.Create("http://localhost/myFile.txt"); // The
server path and name of the file we are saving
BinaryReader rdr = new BinaryReader(File.OpenRead(@strAttachFile)); // The
client path and name of the file we are uploading
byte[] data = rdr.ReadBytes((int)rdr.BaseStream.Length);
myHttpWebRequest.Method = "PUT";
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
myHttpWebRequest.SendChunked = true;
myHttpWebRequest.Timeout = 10000;
myHttpWebRequest.ContentLength = data.Length;
myHttpWebRequest.KeepAlive = true;
Stream s = myHttpWebRequest.GetRequestStream();
s.Write(data, 0, data.Length);
s.Close();
HttpWebResponse myHttpWebResponse =
(HttpWebResponse)myHttpWebRequest.GetResponse();
myHttpWebResponse.Close();
 
B

Branimir Giurov

Hi there -

what is the exception that's being thrown? What are the permissions that the
app runs with?
If you're starting it from a web site, you might have problems with the Code
Access Security policies on the machine ...

Can you please be more specific about the enviornment you/your users are
gonna use?

Cheers,
Branimir
 
J

Joerg Jooss

R said:
Two different web servers I have tried, here they are

Here is the first on a remote web server. I think this is probably a
permissions error and am trying to figure out exactly which ones
because read/write are granted...
File upload failed: System.Net.WebException: The remote server
returned an error: (405) Method Not Allowed.
at System.Net.HttpWebRequest.CheckFinalStatus()
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult
asyncResult) at System.Net.HttpWebRequest.GetResponse()
at myProject.ForumSubmit.uploadFile(String strAttachFile) in
C:\Inetpub\wwwroot\myProject\ForumSubmit.aspx.cs:line 181

What did you try? A PUT? A POST?
Here is the second connection which is just to another folder on my
computer...I also have folder with read/write access so I am not sure
why access is denied.
File upload failed: System.UnauthorizedAccessException: Access to the
path "C:\public\tempFiles\work\docs\myDoc_.doc" is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String str)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess
access, FileShare share, Int32 bufferSize, Boolean useAsync, String
msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess
access, FileShare share)
at System.IO.File.OpenRead(String path)
at myProject.ForumSubmit.uploadFile(String strAttachFile) in
c:\inetpub\wwwroot\myProject\forumsubmit.aspx.cs:line 170

Does the ASP.NET process have write permission for
C:\public\tempFiles\work\docs?
I'm not sure why it's not working or why a folder needs certain
access.

Because of security? It's not a good idea to allow exposed services like a
web server or an application server to do everything on your production
server.
Whenever I try uploading files from my computer to any forum
online they don't need to see my folders as having shared access. I
just choose the file click Submit and it works fine for them. So why
not here?

What has this to do with shared folders on your system? All you need is to
understand the security implications and configure your system accordingly.

Cheers,
 
G

Guest

both actually, but the one that works is PUT. i don't think there is a
problem with the code since it works some times. it only breaks when i am
switching folders from the shared folders on my computer to the unshared
ones. but like i said, having them shared shouldn't matter because if i'm
able to upload to different websites then it shouldn't have to be different
with my project.

Here is my code:
strAttachFile = "C:\temp\blah.txt";
string strFileName = strAttachFile;
strFileName = Path.GetFileName(strFileName);
// Upload the file to a web server using the HttpWebRequest object
// When we create the object we will provide the server path
// and name of the file we are saving
// HttpWebRequest myHttpWebRequest =
(HttpWebRequest)WebRequest.Create("http://www.somelocation.com:8080/"+strFileName);
// The client path and name of the file we are uploading
BinaryReader rdr = new BinaryReader(File.OpenRead(@strAttachFile));
byte[] data = rdr.ReadBytes((int)rdr.BaseStream.Length);
myHttpWebRequest.Method = "PUT";
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
myHttpWebRequest.SendChunked = true;
myHttpWebRequest.Timeout = 10000;
myHttpWebRequest.ContentLength = data.Length;
myHttpWebRequest.KeepAlive = true;
Stream s = myHttpWebRequest.GetRequestStream();
s.Write(data, 0, data.Length);
s.Close();
HttpWebResponse myHttpWebResponse =
(HttpWebResponse)myHttpWebRequest.GetResponse();
myHttpWebResponse.Close();
 
J

Joerg Jooss

R said:
both actually, but the one that works is PUT. i don't think there is
a problem with the code since it works some times.

Note that in case of PUT,
myHttpWebRequest.ContentType="application/x-www-form-urlencoded";
should rather be the uploaded file's content type, not a form submit.
Actually, this content type is always wrong -- no browser performs file
uploads this way.
it only breaks
when i am switching folders from the shared folders on my computer to
the unshared ones.

Excuse my ignorance, but I'm still not sure what a shared folder really is?
A file share? Again, the key is allowing the web server process (PUT) or the
application server process (POST) to write to target directory.

Cheers,
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top