Отправить параметры при загрузке файла
У меня есть этот кусок кода http://pastebin.com/VrMNuxcv который успешно загружает файл на сервер с моего Android.
Я должен отправить пару строковых параметров вместе с ним.
Для этого я дал
conn.setRequestProperty("x-myapp-param1", "Parameter 1 text");
На стороне сервера (метод Servlet DoPsot)
Я пытался получить строковый параметр
String userId = request.getParameter("myapp-param1");
Но
userId is null
Мой код в клиентской части приведен ниже:
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("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("file_name", fileName);
conn.setRequestProperty("x-myapp-param1", "Parameter 1 text");
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"file_name\";filename=\""
+ fileName + "\"" + lineEnd);
dos.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available
();
Код сервера:
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String userId = request.getParameter("myapp-param1");
String x_user_id = request.getParameter("x-myapp-param1");
System.out.println("userId getParameter : "+userId +"x_user_id : "+ x_user_id);
System.out.println("request.getHeaderNames();"+request.getHeaderNames());
System.out.println("request.getHeaderNames();"+request.getHeaders("x"));
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);
// 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();
}
}
}
3 ответа
Есть две основные проблемы:
URLConnection#setRequestProperty()
устанавливает заголовок HTTP-запроса, а не параметр HTTP-запроса. Это две совершенно разные вещи. В случаеmultipart/form-data
запросы, вы должны написать их как полноценную составную часть. Вы можете найти подробный пример в этом ответе (смотрите раздел Загрузка файлов внизу).В случае HTTP
multipart/form-data
запрос, параметры не доступныHttpServletRequest#getParameter()
, Вы должны рассматривать их как составные части, а не как параметры запроса. Вы можете проанализировать их с помощью Apache Commons FileUpload или, когда вы уже используете Servlet 3.0, используяHttpServletRequest#getParts()
, Вы уже используете Apache Commons FileUpload, так что просто сохраните эту часть и избавьтесь от ненужногоgetParameter()
звонки. Обычные параметры доступны в разделе, прокомментированном как "Обрабатывать здесь обычные поля формы".
Проверьте орфографию
Ты сделаешь
conn.setRequestProperty("x-myapp-param1", "Parameter 1 text");
а также
String userId = request.getParameter("myapp-param1");
Обратите внимание на отсутствующий x- на стороне приемника.
Я реализовал свою Fileupload, добавив библиотеки appace-mime, они поддерживают сущности.
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.STRICT);
for(int index=0; index < nameValuePairs.size(); index++) {
ContentBody cb;
if(nameValuePairs.get(index).getName().equalsIgnoreCase("File")) {
File file = new File(nameValuePairs.get(index).getValue());
FileBody isb = new FileBody(file,"application/*");
/*
byte[] data = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(data);
fis.close();
ByteArrayBody bab = new ByteArrayBody(data,"application/*","File");
entity.addPart(nameValuePairs.get(index).getName(), bab);
*/
entity.addPart(nameValuePairs.get(index).getName(), isb);
} else {
// Normal string data
cb = new StringBody(nameValuePairs.get(index).getValue(),"", null);
entity.addPart(nameValuePairs.get(index).getName(),cb);
}
}
httpost.setEntity(entity);