本例子用的服务器是阿里云多语言环境镜像
upload.html代码
<form action="****.*" method="post" enctype="multipart/form-data">
<input type="file" name="mFile"/>
<input type="submit" value="提交">
</form>
接着传输文件后servlet代码
private void savefile(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("utf-8");
DiskFileItemFactory factory = new DiskFileItemFactory();// 获得磁盘文件条目工厂
// 获取服务器下的工程文件中image文件夹的路径
String path = request.getSession().getServletContext().getRealPath("/") + "upload";
response.getWriter().write(path);
/**
* 如果没以下两行设置的话,上传大的 文件 会占用 很多内存, 设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同 原理
* 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的
* 然后再将其真正写到 对应目录的硬盘上
*/
factory.setRepository(new File(path));
// 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
factory.setSizeThreshold(1024 * 1024);
// 高水平的API文件上传处理
ServletFileUpload upload = new ServletFileUpload(factory);
try {
// 可以上传多个文件
List<FileItem> list = (List<FileItem>) upload.parseRequest(request);
for (FileItem item : list) {
// 获取表单的属性名字
String name = item.getFieldName();
// 如果获取的 表单信息是普通的 文本 信息
if (item.isFormField()) {
// 获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
String value = item.getString();
request.setAttribute(name, value);
}
// 对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
else {
/**
* 以下三步,主要获取 上传文件的名字
*/
// 获取路径名
String value = item.getName();
// 索引到最后一个反斜杠
int start = value.lastIndexOf("/");
// 截取上传文件的 字符串名字,加1是去掉反斜杠
String filename = value.substring(start + 1);
// 真正写到磁盘上
File file = new File(path,filename);
item.write(file);
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
android端的文件上传代码
选择了鸿神的Okhttp封装的代码(后期改为rxjava+retrofit(原生,先熟悉),当然,鸿神大大的也是杠杠的)
OkHttpUtils.post().addFile("img",“demo.jpg",new -File(uri)).url(url).build().execute();
addFile(key,filename,file)第一个参数是类似于上文html代码里
<input>
里面的name属性,filename就是文件名,file就是文件。
But,问题来了
当我本地测试通过的时候(未使用app),部署到服务器时,服务器没有任何反应,没有报错,没有网页错误,查看存入文件的文件夹也没有上传的图片。
然后在代码里面添加了response.getWriter().writ()
方法打印页面每一行代码放入了1.2.3.4顺序下来。
发现问题
每当服务器试图向数据盘中写入数据的时候顺序就断了
由此判断,服务器拒绝写入数据。
那我是这么上传代码的?简直是interesting
查询镜像文档后发现改虚拟机(可以创建虚拟机,详情点击查看)
后来根据文档改了权限 设定
chown -R www.www ./*
一切over,看到我的1.2.3.4 出来后 整个人都激动了。
好了,整理完了。
emmmmmm
确实没了