Reputation: 321
I want to post a text file from my desktop using Advanced Rest Client. This is my controller:
@RequestMapping(value = "/vsp/debug/compareConfig/{deviceIp:.*}", method = RequestMethod.POST, consumes = { "multipart/form-data" }, produces = { "application/json" })
public ResponseEntity<SuccessResult> compareCLIs(HttpServletRequest request, @RequestParam("file") MultipartFile file, @PathVariable("deviceIp") String device)
{
log.info(file.getOriginalFilename());
byte[] bytearr = file.getBytes();
log.info("byte length: ", bytearr.length);
log.info("Size : ", file.getSize());
}
This does not return any value for byte length or file size. I want to read the file values to a StringBuffer. Can someone provide pointers regarding this? I am not sure if I need to save this file before parsing it to a string. If so how do I save the file in the workspace?
Upvotes: 32
Views: 84823
Reputation: 4604
The given answers are correct but the top answer said it's not efficient for large files and the reason is that it keeps the whole file in memory which means if you are uploading a 2gb file it will consume that much of memory. Instead of doing that we can read the file line by line and Apache Commons IO provides a nice API for it.
LineIterator it = FileUtils.lineIterator(theFile, "UTF-8");
try {
while (it.hasNext()) {
String line = it.nextLine();
// do something with line
}
} finally {
LineIterator.closeQuietly(it);
}
Upvotes: 3
Reputation: 2601
If you want to load the content of a Multipart file into a String, the easiest solution is:
String content = new String(file.getBytes());
Or, if you want to specify the charset:
String content = new String(file.getBytes(), StandardCharsets.UTF_8);
However, if your file is huge, this solution is maybe not the best.
Upvotes: 53
Reputation: 5636
First, this is not related to Spring, and, second, you don't need to save the file to parse it.
To read the content of a Multipart file into a String you can use Apache Commons IOUtils class like this
ByteArrayInputStream stream = new ByteArrayInputStream(file.getBytes());
String myString = IOUtils.toString(stream, "UTF-8");
Upvotes: 13