Search code examples
javahtmlunit

HtmlUnit HtmlFileInput.setData() not working


I am trying to upload a file to a website using the HtmlUnit HtmlFileInput class. I have the data in a byte[] array and would like to send it up without writing it to a file first.

I'm trying:

    HtmlFileInput fileInput = form.getInputByName("file");
    fileInput.setData(data);
    HtmlElement button = form.getInputByName("validate");
    HtmlPage responsePage = button.click();

This is not working. But, when I try

    HtmlFileInput fileInput = form.getInputByName("file");
    fileInput.setValueAttribute("file.txt");
    HtmlElement button = form.getInputByName("validate");
    HtmlPage responsePage = button.click();

Everything works fine. The docs seem to indicate that setData() does exactly what I want to do, but it doesn't seem like any of the HtmlUnit code even uses the data_ variable that is set when setData() is called. The code uses the files_ field which is set when setValueAttribute() is called.

I noticed several old bugs that were opened that talked about similar problems and it says that they were all fixed.

Am I trying to use setData() in a way that it shouldn't be used?

Thanks.


Solution

  • In short - data_ is used by getSubmitNameValuePairs() and there are also unit tests for that (e.g. com.gargoylesoftware.htmlunit.html.HtmlFileInput2Test.setValueAttributeAndSetDataDummyFile()).

    The trick here is the missing rest of the file - you have to simulate a bit more if you like to get your stuff uploaded. Please set the Value (to submit a dummy file name) and the content type also to help the server to understand your data.

    HtmlFileInput fileInput = form.getInputByName("file");
    fileInput.setValueAttribute("dummy.txt");
    fileInput.setContentType("text/csv");
    fileInput.setData("My file data".getBytes());
    

    I think i have to improve the documentation for this a bit.

    If you like we can discuss this or if you like to see a quick fix - simply open an issue on github.