您的位置:首页 > 编程语言 > Java开发

JavaWeb从入门到放弃(9)-实现一个客户端上传文件到服务端

2017-11-03 15:28 661 查看
先上移动端代码: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;


注:这里的代码有一个判断,看移动端代码,发现这个判断好像没用?其实这个判断是做传文件时候还传其他键值对数值的时候
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: