Httpclient POST mit multipart/form-data
Brauche ich, um ein Bild hochzuladen. Dafür habe ich zu pass-Bild & eine id an den server :
dos.writeBytes("Content-Disposition: form-data; name=\"file_name\";filename=\""
+ fileName + "\"" + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"" + stringFieldName + "\""+ lineEnd);
dos.writeBytes(lineEnd);
fileName ist der Pfad für das Bild
stringFieldName ist die user_id
Mein code ist unten angegeben
public void webservicePhp(Long userId, Bitmap bmp) {
String userIdParameter = String.valueOf(userId);
String fileName = "temporary_holder.jpg";
HttpURLConnection conn = null;
DataOutputStream dos = null;
DataInputStream inStream = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
String charset = "UTF-8";
String responseFromServer = "";
String stringFieldName = "user_id";
String sourceFileUri = HomeScreen.get_path();
String upLoadServerUri = "http://10.120.10.87:8080/ContactsManagerWeb/UploadImage";
File sourceFile = new File(sourceFileUri);
if (!sourceFile.isFile()) {
Log.e("Huzza", "Source File Does not exist");
return;
}
int serverResponseCode = 0;
try { //open a URL connection to the Servlet
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(upLoadServerUri);
conn = (HttpURLConnection) url.openConnection(); //Open a HTTP
//connection to
//the URL
conn.setDoInput(true); //Allow Inputs
conn.setDoOutput(true); //Allow Outputs
conn.setUseCaches(false); //Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Accept-Charset", charset);
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("file_name", fileName);
conn.setRequestProperty("user_id", userIdParameter);
dos = new DataOutputStream(conn.getOutputStream());
dos.write(query.getBytes(charset));
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"file_name\";filename=\""
+ fileName + "\"" + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"" + stringFieldName + "\""+ lineEnd);
dos.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available(); //create a buffer of
//maximum size
bufferSize = (int) sourceFile.length();
System.out.println("BytesAvail" + bytesAvailable);
System.out.println("maxBufferSize" + maxBufferSize);
buffer = new byte[bufferSize];
//read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
//send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
//Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn.getResponseMessage();
System.out.println("Upload file to serverHTTP Response is : "
+ serverResponseMessage + ": " + serverResponseCode);
//close streams
System.out.println("Upload file to server"+ fileName + " File is written");
fileInputStream.close();
dos.flush();
dos.close();
} catch (MalformedURLException ex) {
ex.printStackTrace();
Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
} catch (Exception e) {
e.printStackTrace();
}
//this block will give the response of upload link
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
System.out.println("RESULT Message: " + line);
}
rd.close();
} catch (IOException ioex) {
Log.e("Huzza", "error: " + ioex.getMessage(), ioex);
}
return; //like 200 (Ok)
}
}
In meinem servlet kann ich nicht in der Lage, den Zugriff auf die parameter user_id. Seine nicht immer dort
Servlet.java
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
File filenameImg = null;
List<FileItem> items = null;
try {
items = new ServletFileUpload(new DiskFileItemFactory())
.parseRequest(request);
} catch (FileUploadException e) {
throw new ServletException("Cannot parse multipart request.", e);
}
for (FileItem item : items) {
if (item.isFormField()) {
//Process regular form fields here the same way as
//request.getParameter().
//You can get parameter name by
String fieldname = item.getFieldName();
String fieldvalue = item.getString();
System.out.println("user_id===fieldname====== "+fieldname);
System.out.println("user_id====fieldvalue===== "+fieldvalue);
//You can get parameter value by item.getString();
} else {
try{
//Process uploaded fields here.
String filename = FilenameUtils.getName(item.getName());
//Get filename.
String path = GetWebApplicationPathServlet.getContext().getRealPath("/images");
File file = new File(path,filename);
//File file = new File("C:\\", filename);
//Define destination file.
item.write(file);
System.out.println("filename: "+filename);
System.out.println("file: "+file);
request.setAttribute("image", file);
filenameImg = file;
//Write to destination file.
// request.setAttribute("image", filename);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
//Show result page.
System.out.println("request"+request.getAttribute("image"));
//response.setContentType("image/jpeg");
request.setAttribute("servletName", filenameImg);
getServletConfig().getServletContext().getRequestDispatcher(
"/result.jsp").forward(request,response);
}
if (item.isFormField()) {} is retuned as false :
Bitte Helfen
Hallo jennifer, könnten Sie bitte Kommentar, wie hast du das erklären
query
auf dieser Linie dos.write(query.getBytes(charset));
. Ich habe ein problem beim senden Parameter mit Datei-upload auf den server. Ich versuche mich zu ändern mein code nach diesem thread.
InformationsquelleAutor jennifer | 2011-04-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn das gleiche mit html-Formular Absenden. Dann können Sie versuchen, diese.
In Ihrem
if (item.isFormField()) {
in Ihre Servlets zu tun.Habe ich mit dem gleichen problem vor und das ist die, die für mich gearbeitet. Ich bin mir nicht sicher, ob das, was Sie suchen, nur einen Versuch haben.
Ich muss noch ein parameter 'user_id'. Und durch das hinzufügen des id , ich bin nicht in der Lage, um den parameter-Wert in meinem server
Wenn das der Fall ist, sorry, da habe ich noch nicht verwendet. Ist die
items
Größe mehr als eines? Und wie oft läuft diefor
Durchlaufen? wenn es nur einmal vielleicht ist nur die Datei, die Sie erhalten von ServletFileUploadNur die image-Datei ist die für mich...Punkt.FormField ist falsch
Ich denke mal, deine Plattform ist android und ich bin es nicht gewöhnt ist. Ich kann Ihnen nicht mehr die Lösung. Aber haben Sie einen Blick auf dieses stackoverflow.com/questions/5316588/...
InformationsquelleAutor ace