How to send image data to server from Android

前端 未结 5 583
孤独总比滥情好
孤独总比滥情好 2020-12-16 07:53

I am trying to write an Android application that will take a picture, put the data (byte[]) in an object along with some metadata, and post that to an AppEngine server where

5条回答
  •  渐次进展
    2020-12-16 08:49

    You just need to do a Http-FileUpload which in a special case of a POST. There is no need to uuencode the file. No need to use a special lib/jar No need to save the object to disk (regardless that the following example is doing so)

    You find a very good explanation of Http-Command and as your special focus "file upload" under

    Using java.net.URLConnection to fire and handle HTTP requests

    The file upload sample from there follows (watch "send binary file") and it is possible to add some companion data either


    String param = "value";
    File textFile = new File("/path/to/file.txt");
    File binaryFile = new File("/path/to/file.bin");
    String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
    String CRLF = "\r\n"; // Line separator required by multipart/form-data.
    
    URLConnection connection = new URL(url).openConnection();
    connection.setDoOutput(true);
    connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
    PrintWriter writer = null;
    try {
        OutputStream output = connection.getOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(output, charset), true); // true = autoFlush, important!
    
        // Send normal param.
        writer.append("--" + boundary).append(CRLF);
        writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF);
        writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
        writer.append(CRLF);
        writer.append(param).append(CRLF).flush();
    
        // Send text file.
        writer.append("--" + boundary).append(CRLF);
        writer.append("Content-Disposition: form-data; name=\"textFile\"; filename=\"" + textFile.getName() + "\"").append(CRLF);
        writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
        writer.append(CRLF).flush();
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(new FileInputStream(textFile), charset));
            for (String line; (line = reader.readLine()) != null;) {
                writer.append(line).append(CRLF);
            }
        } finally {
            if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
        }
        writer.flush();
    
        // Send binary file.
        writer.append("--" + boundary).append(CRLF);
        writer.append("Content-Disposition: form-data; name=\"binaryFile\"; filename=\"" + binaryFile.getName() + "\"").append(CRLF);
        writer.append("Content-Type: " +     URLConnection.guessContentTypeFromName(binaryFile.getName()).append(CRLF);
        writer.append("Content-Transfer-Encoding: binary").append(CRLF);
        writer.append(CRLF).flush();
        InputStream input = null;
        try {
            input = new FileInputStream(binaryFile);
            byte[] buffer = new byte[1024];
            for (int length = 0; (length = input.read(buffer)) > 0;) {
                output.write(buffer, 0, length);
            }
            output.flush(); // Important! Output cannot be closed. Close of writer will close output as well.
        } finally {
            if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
        }
        writer.append(CRLF).flush(); // CRLF is important! It indicates end of binary boundary.
    
        // End of multipart/form-data.
        writer.append("--" + boundary + "--").append(CRLF);
    } finally {
        if (writer != null) writer.close();
    }
    

    Regarding the second part of your question. When successful uploading the file (I use apache common files), it is not a big deal to deliver a blob as an image.

    This is how to accept a file in a servlet

    public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse)
            throws ServletException, IOException {
        ServletFileUpload upload = new ServletFileUpload();
    
        try {
            FileItemIterator iter = upload.getItemIterator (pRequest);
    
            while (iter.hasNext()) {
                FileItemStream item = iter.next();
    
                String fieldName = item.getFieldName();
    
                    InputStream stream = item.openStream();
                ....
                    stream.close();
                }
        ...
    

    And this code delivers an image

    public void doGet (HttpServletRequest pRequest, HttpServletResponse pResponse)  throws IOException {
    
        try {
            Blob img = (Blob) entity.getProperty(propImg);
    
            pResponse.addHeader ("Content-Disposition", "attachment; filename=abc.png");
            pResponse.addHeader ("Cache-Control", "max-age=120");
    
            String enc = "image/png";
            pResponse.setContentType (enc);
            pResponse.setContentLength (img.getBytes().length);
            OutputStream out = pResponse.getOutputStream ();
            out.write (img.getBytes());
            out.close();
    

    I hope this code fragments help to answer your questions

提交回复
热议问题