记录功能已经完成,实现参数+txt文件+图片文件的提交,servlet接收并将文件路径存储入库,我们目前决定存储文件的方式是存储其路径,当然这份代码没有连接服务器,我是拿本地试的。先看一下效果截图:
接下来看看代码:
Android端:
【主要功能实现】MainActivity.java:
1 package com.example.toa; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.File; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.RandomAccessFile; 9 import java.text.SimpleDateFormat; 10 import java.util.ArrayList; 11 import java.util.Date; 12 import java.util.HashMap; 13 import java.util.Set; 14 15 import android.annotation.SuppressLint; 16 import android.app.Activity; 17 import android.app.AlertDialog; 18 import android.app.AlertDialog.Builder; 19 import android.content.DialogInterface; 20 import android.content.Intent; 21 import android.content.pm.ActivityInfo; 22 import android.graphics.Bitmap; 23 import android.graphics.BitmapFactory; 24 import android.net.Uri; 25 import android.os.Bundle; 26 import android.os.Environment; 27 import android.provider.MediaStore; 28 import android.text.TextUtils; 29 import android.util.Log; 30 import android.view.LayoutInflater; 31 import android.view.View; 32 import android.view.Window; 33 import android.view.WindowManager; 34 import android.widget.AdapterView; 35 import android.widget.AdapterView.OnItemClickListener; 36 import android.widget.Button; 37 import android.widget.EditText; 38 import android.widget.GridView; 39 import android.widget.ImageView; 40 import android.widget.RadioGroup; 41 import android.widget.SimpleAdapter; 42 import android.widget.SimpleAdapter.ViewBinder; 43 import android.widget.Toast; 44 45 import org.jetbrains.annotations.NotNull; 46 47 import okhttp3.Call; 48 import okhttp3.Callback; 49 import okhttp3.MediaType; 50 import okhttp3.MultipartBody; 51 import okhttp3.OkHttpClient; 52 import okhttp3.Request; 53 import okhttp3.RequestBody; 54 import okhttp3.Response; 55 56 57 public class MainActivity extends Activity implements 58 MyDialog.OnButtonClickListener, OnItemClickListener{ 59 private MyDialog dialog;// 图片选择对话框 60 public static final int NONE = 0; 61 public static final int PHOTOHRAPH = 1;// 拍照 62 public static final int PHOTOZOOM = 2; // 缩放 63 public static final int PHOTORESOULT = 3;// 结果 64 public static final String IMAGE_UNSPECIFIED = "image/*"; 65 public static final MediaType PNG = MediaType.parse("image/png"); 66 67 private GridView gridView; // 网格显示缩略图 68 private final int IMAGE_OPEN = 4; // 打开图片标记 69 private String pathImage; // 选择图片路径 70 private Bitmap bmp; // 导入临时图片 71 private ArrayList<HashMap<String, Bitmap>> imageItem; 72 private SimpleAdapter simpleAdapter; // 适配器 73 private EditText note; // 笔记文本 74 private EditText title; // 标题文本 75 private EditText kemu; //学科 76 private Button handin; // 上传按钮 77 private RadioGroup rg; // 单选按钮组 78 private boolean judge; // 判定公开/私有 79 80 @SuppressLint("SourceLockedOrientationActivity") 81 @Override 82 protected void onCreate(Bundle savedInstanceState) { 83 super.onCreate(savedInstanceState); 84 requestWindowFeature(Window.FEATURE_NO_TITLE); 85 /* 86 * 防止键盘挡住输入框 不希望遮挡设置activity属性 android:windowSoftInputMode="adjustPan" 87 * 希望动态调整高度 android:windowSoftInputMode="adjustResize" 88 */ 89 getWindow().setSoftInputMode( 90 WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); 91 // 锁定屏幕 92 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 93 setContentView(R.layout.activity_main); 94 //点击事件 95 init(); 96 //加载图片与回显 97 initData(); 98 } 99 100 private void init() { 101 //声明 102 note = (EditText)findViewById(R.id.note); 103 gridView = (GridView) findViewById(R.id.gridView); 104 handin = (Button)findViewById(R.id.handin); 105 title = (EditText)findViewById(R.id.title); 106 kemu = (EditText)findViewById(R.id.kemu); 107 rg = (RadioGroup)findViewById(R.id.rg); 108 note.setHorizontallyScrolling(true); 109 gridView.setOnItemClickListener(this); 110 dialog = new MyDialog(this); 111 dialog.setOnButtonClickListener(this); 112 // activity中调用其他activity中组件的方法 113 LayoutInflater layout = this.getLayoutInflater(); 114 View view = layout.inflate(R.layout.layout_select_photo, null); 115 116 //单选按钮(公开/私有) 117 rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 118 @Override 119 public void onCheckedChanged(RadioGroup group, int checkedId) { 120 if(checkedId == R.id.ok){ 121 judge = true; 122 }else{ 123 judge = false; 124 } 125 } 126 }); 127 128 handin.setOnClickListener(new View.OnClickListener() { 129 //是否公开 130 private String see_str = ""; 131 //正文 132 private String note_str = ""; 133 //标题 134 private String title_str = ""; 135 //用户名(登录界面传参获取) 136 private String user_str = "try"; 137 //学科 138 private String kemu_str = ""; 139 //年级(传参获取) 140 private String year_str = "3"; 141 @Override 142 public void onClick(View v) { 143 if(judge){ 144 see_str = "公开"; 145 }else{ 146 see_str = "私有"; 147 } 148 note_str = note.getText().toString(); 149 title_str = title.getText().toString(); 150 kemu_str = kemu.getText().toString(); 151 152 //本地Tomcat,注意不能写localhost,写本机的ip地址【连接服务器时记得改地址】 153 String URL="http://192.168.101.18:8080/CloudNote/CloudServlet"; 154 //URL携带部分参数 155 URL+="?title="+title_str+"&see="+see_str+"&user="+user_str+"&kemu="+kemu_str+"&year="+year_str; 156 //OKHttp 157 OkHttpClient client = new OkHttpClient(); 158 MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.ALTERNATIVE); 159 //文本文件 160 MediaType NoteType = MediaType.parse("text/html;charset=utf-8"); 161 //设置文件命名前缀部分 162 String noteuser = user_str+"_note"; 163 File Notefile = doString(note_str,noteuser); 164 builder.addFormDataPart("note",Notefile.getName(),RequestBody.create(NoteType,Notefile)); 165 166 //图片文件,设定最多上传3张,不包括+号图片。 167 int pic_i=0; 168 for(HashMap<String,Bitmap>pic:imageItem){ 169 Set<String> set=pic.keySet(); 170 for(String key:set){ 171 if(pic_i==0){ 172 //跳过默认的+号图片 173 pic_i++; 174 continue; 175 } 176 //取出bitmap,转换成file,上传 177 else if(pic_i==1){ 178 Bitmap fbm1 = pic.get(key); 179 //设置文件命名前缀部分 180 String image1user = user_str+"_image1"; 181 //调用方法生成图片文件 182 File dofile = doImage(fbm1,image1user); 183 builder.addFormDataPart("image1",dofile.getName(),RequestBody.create(PNG,dofile)); 184 pic_i++; 185 } 186 else if(pic_i==2){ 187 Bitmap fbm2 = pic.get(key); 188 //设置文件命名前缀部分 189 String image2user = user_str+"_image2"; 190 //调用方法生成图片文件 191 File dofile = doImage(fbm2,image2user); 192 builder.addFormDataPart("image2",dofile.getName(),RequestBody.create(PNG,dofile)); 193 pic_i++; 194 } 195 else if(pic_i==3){ 196 Bitmap fbm3 = pic.get(key); 197 //设置文件命名前缀部分 198 String image3user = user_str+"_image3"; 199 //调用方法生成图片文件 200 File dofile = doImage(fbm3,image3user); 201 builder.addFormDataPart("image3",dofile.getName(),RequestBody.create(PNG,dofile)); 202 pic_i++; 203 } 204 } 205 } 206 RequestBody requestBody = builder.build(); 207 Request request = new Request.Builder().url(URL) 208 .post(requestBody) 209 .build(); 210 client.newCall(request).enqueue(new Callback() { 211 @Override 212 public void onFailure(@NotNull Call call, @NotNull IOException e) { 213 Log.i("TRYxxx","连接失败"); 214 e.printStackTrace(); 215 } 216 217 @Override 218 public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { 219 Log.i("TRYxxx","连接的消息"+response.message()); 220 if(response.isSuccessful()){ 221 Log.i("TRYxxx","连接成功"); 222 } 223 } 224 }); 225 } 226 }); 227 } 228 private void initData() { 229 /* 230 * 载入默认图片添加图片加号 231 */ 232 bmp = BitmapFactory.decodeResource(getResources(), 233 R.drawable.ic_addpic); // 加号 234 imageItem = new ArrayList<HashMap<String, Bitmap>>(); 235 HashMap<String, Bitmap> map = new HashMap<String, Bitmap>(); 236 map.put("itemImage", bmp); 237 imageItem.add(map); 238 simpleAdapter = new SimpleAdapter(this, imageItem, 239 R.layout.griditem_addpic, new String[] { "itemImage" }, 240 new int[] { R.id.imageView1 }); 241 simpleAdapter.setViewBinder(new ViewBinder() { 242 @Override 243 public boolean setViewValue(View view, Object data, 244 String textRepresentation) { 245 // TODO Auto-generated method stub 246 if (view instanceof ImageView && data instanceof Bitmap) { 247 ImageView i = (ImageView) view; 248 i.setImageBitmap((Bitmap) data); 249 return true; 250 } 251 return false; 252 } 253 }); 254 gridView.setAdapter(simpleAdapter); 255 } 256 257 //Bitmap转file 258 public static File doImage(Bitmap fbitmap, String user) { 259 ByteArrayOutputStream fbaos = new ByteArrayOutputStream(); 260 fbitmap.compress(Bitmap.CompressFormat.JPEG,100,fbaos); 261 int options = 100; 262 //判断是否大于20kb,是则继续压缩 263 while(fbaos.toByteArray().length/1024>20){ 264 fbaos.reset(); 265 options-=10; 266 fbitmap.compress(Bitmap.CompressFormat.JPEG,options,fbaos); 267 long length = fbaos.toByteArray().length; 268 } 269 SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); 270 Date date = new Date(System.currentTimeMillis()); 271 String filename = user+"_"+format.format(date); 272 String filepath = Environment.getExternalStorageDirectory().toString()+"/CloudNoteImage"; 273 File pathfile = new File(filepath); 274 if(!pathfile.exists()){ 275 pathfile.mkdir(); 276 } 277 File file = new File(filepath,filename+".png"); 278 //注意创建文件,否则会发生文件读取错误 279 if(!file.exists()){ 280 try{ 281 file.createNewFile(); 282 }catch (IOException e){ 283 e.printStackTrace(); 284 } 285 } 286 try{ 287 FileOutputStream fos = new FileOutputStream(file); 288 try{ 289 fos.write(fbaos.toByteArray()); 290 fos.flush(); 291 fos.close(); 292 } catch (IOException e) { 293 e.printStackTrace(); 294 } 295 }catch (IOException e){ 296 e.printStackTrace(); 297 } 298 return file; 299 } 300 301 //将正文信息写入txt文件 302 public static File doString(String strwrite, String user){ 303 //取时间 304 SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); 305 Date date = new Date(System.currentTimeMillis()); 306 //生成文件名 307 String filename = user+"_"+format.format(date); 308 String filepath = Environment.getExternalStorageDirectory().toString()+"/CloudNoteTXT"; 309 //创建文件 310 File pathfile = new File(filepath); 311 if(!pathfile.exists()){ 312 pathfile.mkdir(); 313 } 314 File file = new File(filepath,filename+".txt"); 315 if(!file.exists()){ 316 try{ 317 file.createNewFile(); 318 }catch (IOException e){ 319 e.printStackTrace(); 320 } 321 } 322 try{ 323 FileOutputStream outputStream = new FileOutputStream(file); 324 outputStream.write(strwrite.getBytes()); 325 outputStream.close(); 326 } catch (IOException e) { 327 e.printStackTrace(); 328 } 329 return file; 330 } 331 //调用相机 332 @Override 333 public void camera() { 334 // TODO Auto-generated method stub 335 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 336 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File( 337 Environment.getExternalStorageDirectory(), "temp.jpg"))); 338 startActivityForResult(intent, PHOTOHRAPH); 339 } 340 341 //调用相册 342 @Override 343 public void gallery() { 344 // TODO Auto-generated method stub 345 Intent intent = new Intent(Intent.ACTION_PICK, 346 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 347 startActivityForResult(intent, IMAGE_OPEN); 348 349 } 350 351 @Override 352 public void cancel() { 353 // TODO Auto-generated method stub 354 dialog.cancel(); 355 } 356 357 @Override 358 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 359 // TODO Auto-generated method stub 360 super.onActivityResult(requestCode, resultCode, data); 361 362 if (resultCode == NONE) 363 return; 364 // 拍照 365 if (requestCode == PHOTOHRAPH) { 366 // 设置文件保存路径这里放在跟目录下 367 File picture = new File(Environment.getExternalStorageDirectory() 368 + "/temp.jpg"); 369 startPhotoZoom(Uri.fromFile(picture)); 370 } 371 372 if (data == null) 373 return; 374 375 // 处理结果 376 if (requestCode == PHOTORESOULT) { 377 Bundle extras = data.getExtras(); 378 if (extras != null) { 379 Bitmap photo = extras.getParcelable("data"); 380 ByteArrayOutputStream stream = new ByteArrayOutputStream(); 381 photo.compress(Bitmap.CompressFormat.JPEG, 75, stream);// (0-100)压缩文件 382 // 将图片放入gridview中 383 HashMap<String, Bitmap> map = new HashMap<String, Bitmap>(); 384 map.put("itemImage", photo); 385 imageItem.add(map); 386 simpleAdapter = new SimpleAdapter(this, imageItem, 387 R.layout.griditem_addpic, new String[] { "itemImage" }, 388 new int[] { R.id.imageView1 }); 389 simpleAdapter.setViewBinder(new ViewBinder() { 390 @Override 391 public boolean setViewValue(View view, Object data, 392 String textRepresentation) { 393 // TODO Auto-generated method stub 394 if (view instanceof ImageView && data instanceof Bitmap) { 395 ImageView i = (ImageView) view; 396 i.setImageBitmap((Bitmap) data); 397 return true; 398 } 399 return false; 400 } 401 }); 402 gridView.setAdapter(simpleAdapter); 403 simpleAdapter.notifyDataSetChanged(); 404 dialog.dismiss(); 405 } 406 407 } 408 // 打开图片 409 if (resultCode == RESULT_OK && requestCode == IMAGE_OPEN) { 410 startPhotoZoom(data.getData()); 411 } 412 super.onActivityResult(requestCode, resultCode, data); 413 414 } 415 416 @Override 417 protected void onResume() { 418 // TODO Auto-generated method stub 419 super.onResume(); 420 //判定有图片添加 421 if (!TextUtils.isEmpty(pathImage)) { 422 //bitmap回显 423 Bitmap addbmp = BitmapFactory.decodeFile(pathImage); 424 //将信息存入Map中 425 HashMap<String, Bitmap> map = new HashMap<String, Bitmap>(); 426 map.put("itemImage", addbmp); 427 imageItem.add(map); 428 //在griditem_addpic.xml中向imageView1添加图片 429 simpleAdapter = new SimpleAdapter(this, imageItem, 430 R.layout.griditem_addpic, new String[] { "itemImage" }, 431 new int[] { R.id.imageView1 }); 432 simpleAdapter.setViewBinder(new ViewBinder() { 433 @Override 434 public boolean setViewValue(View view, Object data, 435 String textRepresentation) { 436 // TODO Auto-generated method stub 437 if (view instanceof ImageView && data instanceof Bitmap) { 438 ImageView i = (ImageView) view; 439 i.setImageBitmap((Bitmap) data); 440 return true; 441 } 442 return false; 443 } 444 }); 445 gridView.setAdapter(simpleAdapter); 446 simpleAdapter.notifyDataSetChanged(); 447 // 刷新后释放防止手机休眠后自动添加 448 pathImage = null; 449 dialog.dismiss(); 450 } 451 452 } 453 454 @Override 455 public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 456 // TODO Auto-generated method stub 457 if (imageItem.size() == 4&&position==0) { // 第一张为默认图片,点击+号时才判定是否已满 458 Toast.makeText(MainActivity.this, "图片数3张已满", 459 Toast.LENGTH_SHORT).show(); 460 } else if (position == 0) { // 点击图片位置为+ 0对应0张图片 461 // 选择图片 462 dialog.show(); 463 464 // 通过onResume()刷新数据 465 } else { 466 dialog(position); 467 } 468 469 } 470 471 /* 472 * Dialog对话框提示用户删除操作 position为删除图片位置 473 */ 474 protected void dialog(final int position) { 475 AlertDialog.Builder builder = new Builder(MainActivity.this); 476 builder.setMessage("确认移除已添加图片吗?"); 477 builder.setTitle("提示"); 478 builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { 479 @Override 480 public void onClick(DialogInterface dialog, int which) { 481 dialog.dismiss(); 482 imageItem.remove(position); 483 simpleAdapter.notifyDataSetChanged(); 484 } 485 }); 486 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { 487 @Override 488 public void onClick(DialogInterface dialog, int which) { 489 dialog.dismiss(); 490 } 491 }); 492 builder.create().show(); 493 } 494 495 public void startPhotoZoom(Uri uri) { 496 Intent intent = new Intent("com.android.camera.action.CROP"); 497 intent.setDataAndType(uri, IMAGE_UNSPECIFIED); 498 intent.putExtra("crop", "true"); 499 // aspectX aspectY 是宽高的比例 500 intent.putExtra("aspectX", 1); 501 intent.putExtra("aspectY", 1); 502 // outputX outputY 是裁剪图片宽高 503 intent.putExtra("outputX", 64); 504 intent.putExtra("outputY", 64); 505 intent.putExtra("return-data", true); 506 startActivityForResult(intent, PHOTORESOULT); 507 } 508 509 }
这里一些代码细节在之前的开发总结提到过了,这里不再多提。
其他后台代码如Dialog,GridView参照我的冲刺日(四)博客,与原博主无异,感谢原博主的帮助。
主界面布局文件做出了一些改动,主要是增设了“学科/关键字”输入框,代码如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical" 8 tools:context=".MainActivity"> 9 10 <LinearLayout 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:orientation="horizontal"> 14 15 <LinearLayout 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:orientation="vertical"> 19 20 <EditText 21 android:id="@+id/title" 22 android:layout_width="300dp" 23 android:layout_height="wrap_content" 24 android:hint="请输入标题"></EditText> 25 26 <EditText 27 android:id="@+id/kemu" 28 android:layout_width="150dp" 29 android:layout_height="wrap_content" 30 android:hint="学科/关键字" 31 ></EditText> 32 33 </LinearLayout> 34 <RadioGroup 35 android:id="@+id/rg" 36 android:layout_width="wrap_content" 37 android:layout_height="wrap_content" 38 android:layout_marginLeft="25dp" 39 > 40 <RadioButton 41 android:layout_width="wrap_content" 42 android:layout_height="wrap_content" 43 android:id="@+id/ok" 44 android:text="公开" 45 android:checked="false" 46 > 47 </RadioButton> 48 <RadioButton 49 android:layout_width="wrap_content" 50 android:layout_height="wrap_content" 51 android:id="@+id/no" 52 android:text="私有" 53 android:checked="true" 54 > 55 </RadioButton> 56 </RadioGroup> 57 58 </LinearLayout> 59 60 <EditText 61 android:id="@+id/note" 62 android:layout_width="match_parent" 63 android:layout_height="500dp" 64 android:gravity="top" 65 android:singleLine="false" 66 android:inputType="textMultiLine" 67 android:scrollbars="vertical" 68 android:maxLines="20" 69 android:hint="请输入正文" 70 ></EditText> 71 72 <com.example.toa.MyGridView 73 android:id="@+id/gridView" 74 android:layout_width="match_parent" 75 android:layout_height="wrap_content" 76 android:columnWidth="90dp" 77 android:layout_margin="5dp" 78 android:layout_weight="111" 79 android:gravity="center" 80 android:horizontalSpacing="5dp" 81 android:numColumns="4" 82 android:scrollbars="none" 83 android:stretchMode="columnWidth"> 84 </com.example.toa.MyGridView> 85 86 <Button 87 android:id="@+id/handin" 88 android:layout_width="match_parent" 89 android:layout_height="50dp" 90 android:text="上传" 91 > 92 </Button> 93 </LinearLayout>
Servlet:
CloudServlet(接收文件和参数)【参考博客冲刺日(十三)】
1 package Servlet; 2 3 import java.io.FileOutputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7 import java.util.List; 8 9 import javax.servlet.ServletException; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 15 import org.apache.commons.fileupload.FileItem; 16 import org.apache.commons.fileupload.FileUploadException; 17 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 18 import org.apache.commons.fileupload.servlet.ServletFileUpload; 19 20 import Dao.InsertDao; 21 22 /** 23 * Servlet implementation class CloudServlet 24 */ 25 @WebServlet("/CloudServlet") 26 public class CloudServlet extends HttpServlet { 27 private static final long serialVersionUID = 1L; 28 29 /** 30 * @see HttpServlet#HttpServlet() 31 */ 32 public CloudServlet() { 33 super(); 34 // TODO Auto-generated constructor stub 35 } 36 37 /** 38 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 39 */ 40 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 41 // TODO Auto-generated method stub 42 response.getWriter().append("Served at: ").append(request.getContextPath()); 43 } 44 45 /** 46 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 47 */ 48 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 49 // TODO Auto-generated method stub 50 request.setCharacterEncoding("utf-8"); 51 response.setContentType("text/html;charset=utf-8;"); 52 53 //标题 54 String title = request.getParameter("title"); 55 //公开/私有 56 String see = request.getParameter("see"); 57 //用户名 58 String user = request.getParameter("user"); 59 //学科 60 String kemu = request.getParameter("kemu"); 61 //年级 62 String year = request.getParameter("year"); 63 //TXT文件路径(传参用) 64 String txtfile = null; 65 //图片文件1路径(传参用) 66 String image1file = null; 67 //图片文件2路径(传参用) 68 String image2file = null; 69 //图片文件3路径(传参用) 70 String image3file = null; 71 72 //图片存储文件夹【服务器端记得构建,这是本地的】 73 String imagepath = "E:/CloudNoteTry/Image"; 74 //笔记存储文件夹【服务器端记得构建,这是本地的】 75 String txtpath = "E:/CloudNoteTry/Note"; 76 DiskFileItemFactory factory = new DiskFileItemFactory(); 77 ServletFileUpload upload = new ServletFileUpload(factory); 78 List<FileItem>list; 79 //第1个文件是txt,234是图片文件 80 int point=1; 81 try { 82 list = upload.parseRequest(request); 83 for(FileItem item:list) { 84 if(!item.isFormField()) { 85 String filename = item.getName(); 86 int len = 0; 87 byte buff[] = new byte[1024]; 88 if(point == 1) { 89 txtfile = txtpath+"/"+filename; 90 InputStream inputStream = item.getInputStream(); 91 OutputStream outputStream = new FileOutputStream(txtpath+"/"+filename); 92 //读写文件内容 93 while((len = inputStream.read(buff))!=-1) { 94 outputStream.write(buff,0,len); 95 } 96 outputStream.flush(); 97 outputStream.close(); 98 inputStream.close(); 99 }else { 100 if(point == 2) { 101 image1file = imagepath+"/"+filename; 102 }else if(point == 3) { 103 image2file = imagepath+"/"+filename; 104 }else if(point == 4) { 105 image3file = imagepath+"/"+filename; 106 } 107 InputStream inputStream = item.getInputStream(); 108 OutputStream outputStream = new FileOutputStream(imagepath+"/"+filename); 109 //读写文件内容 110 while((len = inputStream.read(buff))!=-1) { 111 outputStream.write(buff,0,len); 112 } 113 outputStream.flush(); 114 outputStream.close(); 115 inputStream.close(); 116 } 117 point++; 118 } 119 } 120 }catch(FileUploadException e) { 121 e.printStackTrace(); 122 } 123 //判定是否为null,否则可能会报错 124 if(title==null) { 125 title="ERROR"; 126 }if(see==null) { 127 see="ERROR"; 128 }if(user==null) { 129 user="ERROR"; 130 }if(kemu==null) { 131 kemu="ERROR"; 132 }if(year==null) { 133 year="ERROR"; 134 } 135 136 //声明Dao包内InsertDao对象,调用添加方法 137 InsertDao ins = new InsertDao(); 138 //返回为boolean类型,根据结果判断是否成功 139 if(ins.insertCN(user, year, kemu, title, txtfile, image1file, image2file, image3file, see)) { 140 System.out.println("添加成功"); 141 }else { 142 System.out.println("添加失败"); 143 } 144 } 145 146 }
Dao层添加数据入库代码:InsertDao:
1 package Dao; 2 3 import java.sql.Connection; 4 import java.sql.SQLException; 5 import java.sql.Statement; 6 import util.DBUtil; 7 8 public class InsertDao { 9 public boolean insertCN(String user,String year,String kemu,String title,String note,String image1,String image2,String image3,String see) { 10 boolean res = false; 11 //添加语句,PYDcloud为表名 12 String sql="insert into PYDcloud(user,nianji,kemu,title,note,image1,image2,image3,SEE)" 13 +"values('"+user+"','"+year+"','"+kemu+"','"+title+"','"+note+"','"+image1+"','"+image2+"','"+image3+"','"+see+"')"; 14 Connection conn = DBUtil.getConn(); 15 Statement state = null; 16 int a = 0; 17 try { 18 state = conn.createStatement(); 19 //每执行一条语句,a++ 20 a = state.executeUpdate(sql); 21 }catch (Exception e) { 22 e.printStackTrace(); 23 }finally { 24 try { 25 DBUtil.close(state, conn); 26 } catch (SQLException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } 30 } 31 if (a > 0) { 32 //返回为真 33 res = true; 34 } 35 //返回为假 36 return res; 37 } 38 39 }
总结:
写这个”记录“功能我新学了很多东西,包括图片选择回显,OKHttp等,本来这个任务可以提早完成的,奈何上一周状态实在不佳,对编写代码有许些抵触,然而我们的项目还有很多没有写完,我不能因此直接怠惰下去,这次记录功能画上了一个句号,我也需要调整心态,将这次的工作作为一个教训,要时刻提醒自己不能松懈。