Загрузка изображения из приложения Java Desktop на сервер

99
10

Я использую следующий код на стороне клиента для загрузки на сервер


public class UploaderExample{

private static final String Boundary = "--7d021a37605f0";

public void upload(URL url, List<File> files) throws Exception
{
HttpURLConnection theUrlConnection = (HttpURLConnection) url.openConnection();
theUrlConnection.setDoOutput(true);
theUrlConnection.setDoInput(true);
theUrlConnection.setUseCaches(false);
theUrlConnection.setChunkedStreamingMode(1024);

theUrlConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary="
+ Boundary);

DataOutputStream httpOut = new DataOutputStream(theUrlConnection.getOutputStream());

for (int i = 0; i < files.size(); i++)
{
File f = files.get(i);
String str = "--" + Boundary + "\r\n"
+ "Content-Disposition: form-data;name=\"file" + i + "\"; filename=\"" + f.getName() + "\"\r\n"
+ "Content-Type: image/png\r\n"
+ "\r\n";

httpOut.write(str.getBytes());

FileInputStream uploadFileReader = new FileInputStream(f);
int numBytesToRead = 1024;
int availableBytesToRead;
while ((availableBytesToRead = uploadFileReader.available()) > 0)
{
byte[] bufferBytesRead;
bufferBytesRead = availableBytesToRead >= numBytesToRead ? new byte[numBytesToRead]
: new byte[availableBytesToRead];
uploadFileReader.read(bufferBytesRead);
httpOut.write(bufferBytesRead);
httpOut.flush();
}
httpOut.write(("--" + Boundary + "--\r\n").getBytes());

}

httpOut.write(("--" + Boundary + "--\r\n").getBytes());

httpOut.flush();
httpOut.close();

// read & parse the response
InputStream is = theUrlConnection.getInputStream();
StringBuilder response = new StringBuilder();
byte[] respBuffer = new byte[4096];
while (is.read(respBuffer) >= 0)
{
response.append(new String(respBuffer).trim());
}
is.close();
System.out.println(response.toString());
}

public static void main(String[] args) throws Exception
{
List<File> list = new ArrayList<File>();
list.add(new File("C:\\square.png"));
list.add(new File("C:\\narrow.png"));
UploaderExample uploader = new UploaderExample();
uploader.upload(new URL("http://systemout.com/upload.php"), list);
}


}


Я пытался писать сервлет, который получает файл изображения и сохраняет его в папку на сервере.... но с треском провалился... Это часть учебного проекта мне нужно представить как часть моей степени....Пожалуйста помоги!!!
 Я хочу помочь... может ли кто-нибудь направить меня на то, как будет написан сервлет....


Я попробовал следующее:


 response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

try {

InputStream input = null;
OutputStream output = null;

try {
input = request.getInputStream();
output = new FileOutputStream("C:\\temp\\file.png");

byte[] buffer = new byte[10240];
for (int length = 0; (length = input.read(buffer)) > 0 ; ) {
output.write(buffer, 0, length);
}
}
catch(Exception e){
out.println(e.getMessage());
}
finally {
if (output != null) {
output.close();
}
if (input != null) {
input.close();
}
}

out.println("Success");
}
catch(Exception e){
out.println(e.getMessage());
}
finally {
out.close();
}
}


Я пошел дальше и попробовал fileupload с apache.org.... и написал следующий код сервлета:


protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

try {
out.println(1);
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {

// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Parse the request
List /* FileItem */ items = upload.parseRequest(request);

// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();

if (item.isFormField()) {
//processFormField(item);
} else {
//processUploadedFile(item);
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();

//write to file
File uploadedFile = new File("C:\\temp\\image.png");
item.write(uploadedFile);

out.println("Sucess!");
}
}

} else {
out.println("Invalid Content!");
}
} catch (Exception e) {
out.println(e.getMessage());
} finally {
out.close();
}
}


Однако я до сих пор путают о том, как писать многосекционный код на стороне клиента... один я писал выше, не работает с моей реализации сервлета..... помощь пожалуйста.... некоторые ссылки, где я могу научиться писать многопользовательскую форму из java desktop app было бы полезно

спросил(а) 2021-01-25T16:40:53+03:00 5 месяцев назад
1
Решение
88

Итак, вот моя рекомендация: не пишите этот код сами! Вместо этого используйте http://commons.apache.org/fileupload/. Это избавит вас от многих головных болей, и вы будете быстро и быстро работать. Я уверен, что проблема заключается в том, что InputStream содержит границы нескольких частей и, следовательно, не является допустимым образом.

Вот еще одно замечание: поскольку вы не делаете никаких преобразований на изображении, нет необходимости читать и писать байты изображения с помощью ImageIO. Вам лучше писать байты прямо из InputStream в файл.

ответил(а) 2021-01-25T16:40:53+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема