Загрузка изображения из приложения Java Desktop на сервер - PullRequest
0 голосов
/ 14 апреля 2011

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

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();
    }
}

Я попытался загрузить файл с 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

1 Ответ

0 голосов
/ 14 апреля 2011

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

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

...