Naftuli Kay
Naftuli Kay

Reputation: 91630

Send a file with a PUT request using a HttpURLConnection

I'm trying to do something relatively simple. I need to make a simple PUT request with a file in the body in order to upload a file to a server not in my control. Here's the code I have so far:

connection = ((HttpURLConnection)new URL(ticket.getEndpoint()).openConnection());
connection.setRequestMethod("PUT");
connection.setRequestProperty("Content-Type", "video/mp4");
connection.setRequestProperty("Content-Length", String.valueOf(getStreamFile().length()));
connection.setUseCaches(false);
connection.setDoOutput(true);

connection.connect();

outputStream = connection.getOutputStream();

streamFileInputStream = new FileInputStream(getStreamFile());
streamFileBufferedInputStream = new BufferedInputStream(streamFileInputStream);

byte[] streamFileBytes = new byte[getBufferLength()];
int bytesRead = 0;
int totalBytesRead = 0;

while ((bytesRead = streamFileBufferedInputStream.read(streamFileBytes)) > 0) {
    outputStream.write(streamFileBytes, 0, bytesRead);
    outputStream.flush();

    totalBytesRead += bytesRead;

    notifyListenersOnProgress((double)totalBytesRead / (double)getStreamFile().length());
}

outputStream.close();

logger.debug("Wrote {} bytes of {}, ratio: {}", 
        new Object[]{totalBytesRead, getStreamFile().length(), 
            (double)totalBytesRead / (double)getStreamFile().length()});

I'm watching my network manager and nothing near the size of my file gets sent. In fact, I don't know if anything is being sent at all, but I don't see any errors thrown.

I need to be able to send this request and also measure the status of the upload synchronously, so as to be able to inform my listeners of the upload progress. How can I modify my existing example to just work™?

Upvotes: 1

Views: 6104

Answers (1)

Ignux02
Ignux02

Reputation: 111

Try setting the content-type param to multipart/form-data. W3C forms.

Upvotes: 2

Related Questions