JavaWeb从入门到放弃(9)-实现一个客户端上传文件到服务端
程序员文章站
2024-03-22 19:18:04
...
先上移动端代码:retrofit+rxjava
Map<String, String> map = new HashMap<>();
File file = new File(Environment.getExternalStorageDirectory(), "DebugData/pic.jpeg");
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
OkHttpClient client = new OkHttpClient.Builder().
connectTimeout(60, TimeUnit.SECONDS).
readTimeout(60, TimeUnit.SECONDS).
writeTimeout(60, TimeUnit.SECONDS).build();
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://shb2058.free.ngrok.cc")
.addConverterFactory(StringConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
RetrofitInterface httpApiS = retrofit.create(RetrofitInterface.class);
httpApiS.updateImage(part)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String loginBean) {
Log.e("返回的数据", loginBean);
TextView tt = (TextView) findViewById(R.id.ttt);
tt.setText(loginBean);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
@Multipart
@POST("/Practice_Project/MyServlet")
Observable<String> updateImage(@Part MultipartBody.Part file);
服务端代码:
注:保存的地址是固定的C/picture;如果需要让外部可以通过url来访问图片,见博客http://blog.csdn.net/shb2058/article/details/77520925
DiskFileItemFactory factory =new DiskFileItemFactory();
//得到绝对文件夹路径,比如"D:\\Tomcat6\\webapps\\test\\upload"
String path = request.getRealPath("/upload");
//临时文件夹路径
String repositoryPath =request.getRealPath("/upload/temp");
// 设定临时文件夹为repositoryPath
factory.setRepository(new File(repositoryPath));
// 设定上传文件的阈值,如果上传文件大于1M,就可能在repository
// 所代 表的文件夹中产生临时文件,否则直接在内存中进行处理
factory.setSizeThreshold(1024* 1024);
// 创建一个ServletFileUpload对象
ServletFileUpload uploader =new ServletFileUpload(factory);
try
{
// 调用uploader中的parseRequest方法,可以获得请求中的相关内容,
// 即一个FileItem类型的ArrayList。FileItem是在
// org.apache.commons.fileupload中定义的,它可以代表一个文件,
// 也可以代表一个普通的form field
ArrayList<FileItem>list = (ArrayList<FileItem>)uploader.parseRequest(request);
System.out.println(list.size());
for(FileItem fileItem : list)
{
if(fileItem.isFormField()) // 如果是普通的form field
{
String name = fileItem.getFieldName();
String value = fileItem.getString();
System.out.println(name+ " = " + value);
}
else // 如果是文件
{
String value = fileItem.getName();
System.out.print("收到的文件名字"+value);
// 名为fileName的文件中
fileItem.write(new File("c:/picture/test.jpeg"));
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
PrintWriter out = response.getWriter();
out.write("上传成功");
out.close();
out = null;
注:这里的代码有一个判断,看移动端代码,发现这个判断好像没用?其实这个判断是做传文件时候还传其他键值对数值的时候