Httpclient à enregistrer à l'aide multipart/form-data
J'ai besoin de charger une image. Pour ce que j'ai à passer de l'image & id sur le serveur :
dos.writeBytes("Content-Disposition: form-data; name=\"file_name\";filename=\""
+ fileName + "\"" + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"" + stringFieldName + "\""+ lineEnd);
dos.writeBytes(lineEnd);
nom de fichier est le chemin de l'image
stringFieldName est le user_id
Mon code est donné ci-dessous
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)
}
}
Dans ma servlet je ne peux pas en mesure d'accéder à l'user_id paramètre. Ses pas y arriver
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 :
S'Il Vous Plaît Aider
- Salut jennifer pourrait s'il vous plaît commentaire comment avez-vous déclarer
query
sur cette lignedos.write(query.getBytes(charset));
. J'ai un problème d'envoi de paramètres avec upload de fichier vers le serveur. Je suis en train de modifier mon code en fonction de ce fil.
Vous devez vous connecter pour publier un commentaire.
Si c'est la même chose avec html soumettre le formulaire. Ensuite, vous pouvez essayer cette.
Dans votre
if (item.isFormField()) {
dans vos Servlets ce faire.Je les ai le même problème avant, et c'est le seul qui a travaillé pour moi. Je ne suis pas sûr si ce que vous recherchez, juste avoir un essai.
items
taille de plus d'un? Et combien de fois ne l'for
itération? si c'est seulement une fois peut-être que le fichier que vous obtenez à partir de ServletFileUpload