Reputation: 8375
Hello i am wanting to upload image from android emulator to asp.net server. The code below can communicate the server. When I tried to create a text file to see the data sent from android was successful or not . But no the file data didn't send across to the server. I tried sending the plain text to the server but the file I created on the server didn't print the text.
The code here: HttpURLConnection conn = null;
String boundary = "==============";
try
{
String disposition = "Content-Disposition: form-data; name=\"userfile\"; filename=\"" + filename + ".jpg\"";
String contentType = "Content-Type: application/octet-stream";
String t1 = "Content-Disposition: form-data; name=\"test\";";
String t2 = "Content-Type: text/plain";
// This is the standard format for a multipart request
StringBuffer requestBody = new StringBuffer();
/*
requestBody.append("--"+boundary);
requestBody.append('\n');
requestBody.append(disposition);
requestBody.append('\n');
requestBody.append(contentType);
requestBody.append('\n');
requestBody.append('\n');
requestBody.append(new String(getByteFromStream(stream)));
*/
requestBody.append('\n');
requestBody.append('\n');
requestBody.append("--"+boundary);
requestBody.append('\n');
requestBody.append(t1);
requestBody.append('\n');
requestBody.append(t2);
requestBody.append('\n');
requestBody.append('\n');
requestBody.append("basdfsdafsadfsad");
requestBody.append("--"+boundary+"--");
// Make a connect to the server
URL url = new URL(targetURL);
conn = (HttpURLConnection) url.openConnection();
// Put the authentication details in the request
/*
if (username != null) {
String usernamePassword = username + ":" + password;
String encodedUsernamePassword = Base64.encodeBytes(usernamePassword.getBytes());
conn.setRequestProperty ("Authorization", "Basic " + encodedUsernamePassword);
}
*/
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("MIME-Version:", "1.0");
conn.setRequestProperty("Content-Type", "multipart/mixed; boundary=" + boundary);
// Send the body
DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream());
dataOS.writeBytes(requestBody.toString());
dataOS.flush();
dataOS.close();
// Ensure we got the HTTP 200 response code
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
throw new Exception(String.format("Received the response code %d from the URL %s", responseCode, url));
}
Is my request body layout not correctly ?
Upvotes: 2
Views: 6193
Reputation: 61
Because you upload two files, so you should see the last format. Good luck for you. 6. Examples
Suppose the server supplies the following HTML:
<FORM ACTION="http://server.dom/cgi/handle"
ENCTYPE="multipart/form-data"
METHOD=POST>
What is your name? <INPUT TYPE=TEXT NAME=submitter>
What files are you sending? <INPUT TYPE=FILE NAME=pics>
</FORM>
and the user types "Joe Blow" in the name field, and selects a text file "file1.txt" for the answer to 'What files are you sending?'
The client might send back the following data:
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="field1"
Joe Blow
--AaB03x
content-disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
If the user also indicated an image file "file2.gif" for the answer to 'What files are you sending?', the client might client might send back the following data:
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="field1"
Joe Blow
--AaB03x
content-disposition: form-data; name="pics"
Content-type: multipart/mixed, boundary=BbC04y
--BbC04y
Content-disposition: attachment; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--BbC04y
Content-disposition: attachment; filename="file2.gif"
Content-type: image/gif
Content-Transfer-Encoding: binary
...contents of file2.gif...
--BbC04y--
--AaB03x--
Form-based File Upload in HTML
Upvotes: 0
Reputation: 149
I am using asp.net for as file handler. Below is the simple Android code for the event you will use to upload the file
String pathToOurFile = "/mnt/sdcard/sysdroid.png";//this will be the file path String urlServer = "http://yourdomain/fileupload.aspx";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1*1024*1024;
try
{
FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile) );
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data");
connection.setRequestProperty("SD-FileName", "sysdroid.png");//This will be the file name
outputStream = new DataOutputStream( connection.getOutputStream() );
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
int serverResponseCode = connection.getResponseCode();
String serverResponseMessage = connection.getResponseMessage();
Log.d("ServerCode",""+serverResponseCode);
Log.d("serverResponseMessage",""+serverResponseMessage);
fileInputStream.close();
outputStream.flush();
outputStream.close();
}
catch (Exception ex)
{
//ex.printStackTrace();
Log.e("Error: ", ex.getMessage());
}
So far so good. Lets look into the asp.net code. I used simple 'Web Form' for this. The code behind is
protected void Page_Load(object sender, EventArgs e)
{
string uploadDir = Server.MapPath("~/images");
string imgPath = Path.Combine(uploadDir, Request.Headers["SD-FileName"]);
try{
byte[]bytes = new byte[Request.InputStream.Length];
Request.InputStream.Read(bytes, 0, bytes.Length);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
Bitmap btMap = (Bitmap)System.Drawing.Image.FromStream(ms);
btMap.Save(imgPath, ImageFormat.Jpeg);
ms.Close();
}
catch (Exception exp)
{
Response.Write(exp.Message);
}
}
Hope this will work and you have the knowledge of read/write permissions on both Android's SD card and asp.net folders.
cheers Fahar
Upvotes: 8