本地上傳文件到服務器,從服務器下載文件到本地


最近在做項目的時候涉及到了文件的上傳、下載,以前學習IO時也沒有搞得多清楚,在網上找了些上傳下載的例子,然后修改了部分。經測試,上傳下載文件暫時能用,下面是上傳和下載的方法:

1.本地上傳文件到服務器

  html代碼:

<form id="uploadDatumInfo" name="uploadDatumInfo" method="post" enctype="multipart/form-data" target="target_upload"><!-- 注意要加上:enctype="multipart/form-data"--> 
  <input type="file" id="datum_address" name="datum_address" class="" /> 
</form>

  js代碼:

function uploadDatum()
{
     <!-- 驗證上傳文件是否為空 --> var datum_address=$("#datum_address").val(); if(datum_address=='') { alert("上傳文件不能為空!"); return; }
<!-- 提交表單數據 --> document.uploadDatumInfo.action="<%=WebConstants.WEB_ROOT%>/saveUploadMyDatum.do?&<%=MctsUtils.getURLRandom() %>"; document.uploadDatumInfo.submit(); }

  后台代碼:@Controller

@Controller
public
class MyController { @Resource(name = "MyService") private MyService myService; private ResourceManager rm = ResourceManager.getInstance(); //保存上傳資料信息 @RequestMapping(value = "/saveUploadMyDatum.do") public void saveUploadMyDatum(HttpServletRequest request, HttpServletResponse response, final ModelMap context, VcDatumInfo vcDatumInfo) throws Exception { try { String myDir = rm.getValue("my_file_path"); String fileDir = rm.getValue("my_space_path"); File sourceFolder = new File(myDir + "/" + fileDir);創建存儲文件夾 if (!sourceFolder.exists())
       { sourceFolder.mkdirs(); } String datum_address
= ""; DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(2048 * 1024); UploadProgressListener getBarListener = new UploadProgressListener(request); ServletFileUpload upload = new ServletFileUpload(factory); upload.setProgressListener(getBarListener); List<Object> formList = upload.parseRequest(request); Iterator<Object> formItem = formList.iterator(); while (formItem.hasNext())
       { FileItem item
= (FileItem) formItem.next(); if (!item.isFormField())
          {
if (item != null && item.getSize() > 0)
            { String fieldName
= item.getFieldName(); String timeTemp = String.valueOf(new Date().getTime()); String subname = item.getName().substring( item.getName().lastIndexOf(".", item.getName().length()));//獲取上傳文件的后綴名 String realName = item.getName().substring(0, item.getName().lastIndexOf("."));//獲取上傳文件的文件名 //System.out.println(realName); if (fieldName.equals("datum_address"))
              { datum_address
= fileDir + "/" + "datum_" + timeTemp + "_" + realName + subname;//要保存到數據庫中的文件地址
                
File file = new File(myDir + "/" + datum_address);//創建保存路徑
                             item.write(file);//寫入文件數據
                        }
                     }
                 } 
        }
      }
  } 
}

 2.從服務器下載文件

  后台代碼:  

       String myDir = rm.getValue("my_file_path"); 
            OutputStream toClient = null;
            String path = "";
            path = myDir + "/" + vcDatumInfo.getDatum_address();
            try {
                // path是指欲下載的文件的路徑。
                File file = new File(path);
                // 取得文件名
                String filename = file.getName();
                // 取得文件的后綴名。
                String ext = filename.substring(filename.lastIndexOf(".") + 1);
                String realName = file.getName().substring(file.getName().lastIndexOf("_") + 1, file.getName().lastIndexOf("."));//取得文件名,這一步得到的文件名有可能不是上傳時的原文件名
                String realFileName = realName + "." + ext;
                // 以流的形式下載文件
                InputStream fis = new BufferedInputStream(new FileInputStream(path));
                byte[] buffer = new byte[fis.available()];
                fis.read(buffer);
                fis.close();
                // 清空response
                response.reset();
                // 設置response的Header
                response.addHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(realFileName, "UTF-8"));//注意這一步設置文件名時,中文容易出現亂碼
                response.addHeader("Content-Length", "" + file.length());
                toClient = new BufferedOutputStream(response.getOutputStream());
                response.setContentType("application/octet-stream");
                toClient.write(buffer);
                
                vcDatumInfo.setDownload_number(vcDatumInfo.getDownload_number() + 1);
                vcSpaceService.updateDatumInfo(vcDatumInfo);
                
            } catch (IOException ex) {
                ex.printStackTrace();
            }finally
            {
                if(toClient != null)
                {
                    toClient.flush();
                    toClient.close();
                }
            }

最后,感謝分享例子的作者!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM