我对Java 非常陌生,并且大部分时间都在教我自己,所以我开始构建一个applet.我想创建一个可以从本地磁盘中选择文件并将其作为multipart/form-data POST请求上传但有进度条的文件.显然,用户必须授予Java applet访问硬盘驱动器的权限.现在我已经完成了第一部分工作:用户可以使用JFileChooser对象选择一个文件,方便地返回一个File对象.但我想知道接下来会发生什么.我知道这File.length()将给我文件的总大小(以字节为单位),但是如何将所选内容发送File到网络,以及如何监控已发送的字节数?提前致谢.
我正在使用Spring for Android作为Android应用程序中远程调用的REST模板.
目前正致力于将图像上传到服务器.
我想出了类似的东西:
public Picture uploadPicture(String accessToken, String fileToUpload) throws RestClientException {
RestTemplate rest = new RestTemplate();
FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
formConverter.setCharset(Charset.forName("UTF8"));
CustomGsonHttpMessageConverter jsonConverter = new CustomGsonHttpMessageConverter();
rest.getMessageConverters().add(formConverter);
rest.getMessageConverters().add(jsonConverter);
String uploadUri = AppConfig.ROOT_URL.concat(AppConfig.ADD_PHOTO);
HashMap<String, Object> urlVariables = new HashMap<String, Object>();
urlVariables.put("accessToken", accessToken);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setAccept(Collections.singletonList(MediaType.parseMediaType("application/json")));
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
parts.add("picture", new FileSystemResource(fileToUpload));
Picture response = rest.postForObject(uploadUri, parts, Picture.class, urlVariables);
return response;
}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,但现在我想从中获取进度更新.
有谁知道它是否可能以及如何做到这一点?
提前致谢 :)
我有一个Java桌面客户端应用程序,可以将文件上传到REST服务.
使用Spring RestTemplate类处理对REST服务的所有调用.
我正在寻求实现进度条并取消功能,因为上传的文件可能非常大.
我一直在寻找一种在网上实现这一点的方法,但没有运气.
我尝试实现自己的ResourceHttpMessageConverter并替换writeInternal()方法,但是在实际发布请求之前,似乎在某种缓冲操作期间调用了此方法(因此在发送之前一次性读取流).
我甚至尝试重写CommonsClientHttpRequestFactory.createRequest()方法并使用特殊的writeRequest()方法实现我自己的RequestEntity类,但是会出现同样的问题(在实际发送帖子之前都会读取流).
我在找错了地方吗?有没有人做过类似的事情.
我在网上看到的很多关于实现进度条的内容都谈到了关闭上传,然后使用单独的AJAX请求来轮询Web服务器的进度,这似乎是一种奇怪的方式.
任何帮助或提示非常感谢.
progress-bar ×2
spring ×2
upload ×2
android ×1
file-io ×1
file-upload ×1
java ×1
multipart ×1
rest ×1
resttemplate ×1