1. 程式人生 > >java後臺接受app上傳圖片

java後臺接受app上傳圖片

package com.sujinabo.file;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;




/**
 * Servlet implementation class FileDemo
 */
@WebServlet("/FileDemo")
public class FileDemo extends HttpServlet {
    
      /**
         * 
         */
        private static final long serialVersionUID = 564190060577130813L;

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
                    //得到上傳檔案的儲存目錄,將上傳的檔案存放於WEB-INF目錄下,不允許外界直接訪問,保證上傳檔案的安全
                    String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
                    //上傳時生成的臨時檔案儲存目錄
                    String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
                    File tmpFile = new File(tempPath);
                    if (!tmpFile.exists()) {
                        //建立臨時目錄
                        tmpFile.mkdir();
                    }
                    
                    //訊息提示
                    String message = "";
                    try{
                        //使用Apache檔案上傳元件處理檔案上傳步驟:
                        //1、建立一個DiskFileItemFactory工廠
                        DiskFileItemFactory factory = new DiskFileItemFactory();
                        //設定工廠的緩衝區的大小,當上傳的檔案大小超過緩衝區的大小時,就會生成一個臨時檔案存放到指定的臨時目錄當中。
                        factory.setSizeThreshold(1024*100);//設定緩衝區的大小為100KB,如果不指定,那麼緩衝區的大小預設是10KB
                        //設定上傳時生成的臨時檔案的儲存目錄
                        factory.setRepository(tmpFile);
                        //2、建立一個檔案上傳解析器
                        ServletFileUpload upload = new ServletFileUpload(factory);
                        //監聽檔案上傳進度
                        upload.setProgressListener(new ProgressListener(){
                            public void update(long pBytesRead, long pContentLength, int arg2) {
                                System.out.println("檔案大小為:" + pContentLength + ",當前已處理:" + pBytesRead);
                                /**
                                 * 檔案大小為:14608,當前已處理:4096
                                    檔案大小為:14608,當前已處理:7367
                                    檔案大小為:14608,當前已處理:11419
                                    檔案大小為:14608,當前已處理:14608
                                 */
                                float f = pBytesRead/pContentLength;
                                try {
                                    response.getWriter().write(f+"");
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                                
                            }
                        });
                         //解決上傳檔名的中文亂碼
                        upload.setHeaderEncoding("UTF-8"); 
                        //3、判斷提交上來的資料是否是上傳表單的資料
                        if(!ServletFileUpload.isMultipartContent(request)){
                            //按照傳統方式獲取資料
                            return;
                        }
                        
                        //設定上傳單個檔案的大小的最大值,目前是設定為1024*1024位元組,也就是1MB
                        upload.setFileSizeMax(1024*1024);
                        //設定上傳檔案總量的最大值,最大值=同時上傳的多個檔案的大小的最大值的和,目前設定為10MB
                        upload.setSizeMax(1024*1024*10);
                        //4、使用ServletFileUpload解析器解析上傳資料,解析結果返回的是一個List<FileItem>集合,每一個FileItem對應一個Form表單的輸入項
                        List<FileItem> list = upload.parseRequest(request);
                        for(FileItem item : list){
                            //如果fileitem中封裝的是普通輸入項的資料
                            if(item.isFormField()){
                                String name = item.getFieldName();
                                //解決普通輸入項的資料的中文亂碼問題
                                String value = item.getString("UTF-8");
                                //value = new String(value.getBytes("iso8859-1"),"UTF-8");
                                System.out.println(name + "=" + value);
                            }else{//如果fileitem中封裝的是上傳檔案
                                //得到上傳的檔名稱,
                                String filename = item.getName();
                                System.out.println(filename);
                                if(filename==null || filename.trim().equals("")){
                                    continue;
                                }
                                //注意:不同的瀏覽器提交的檔名是不一樣的,有些瀏覽器提交上來的檔名是帶有路徑的,如:  c:\a\b\1.txt,而有些只是單純的檔名,如:1.txt
                                //處理獲取到的上傳檔案的檔名的路徑部分,只保留檔名部分
                                filename = filename.substring(filename.lastIndexOf("\\")+1);
                                //得到上傳檔案的副檔名
                                String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
                                //如果需要限制上傳的檔案型別,那麼可以通過檔案的副檔名來判斷上傳的檔案型別是否合法
                                System.out.println("上傳的檔案的副檔名是:"+fileExtName);
                                //獲取item中的上傳檔案的輸入流
                                InputStream in = item.getInputStream();
                                //得到檔案儲存的名稱
                                String saveFilename = makeFileName(filename);
                                //得到檔案的儲存目錄
                                String realSavePath = makePath(saveFilename, savePath);
                                System.out.println(realSavePath);
                                //建立一個檔案輸出流
                                FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);
                                //建立一個緩衝區
                                byte buffer[] = new byte[1024];
                                //判斷輸入流中的資料是否已經讀完的標識
                                int len = 0;
                                //迴圈將輸入流讀入到緩衝區當中,(len=in.read(buffer))>0就表示in裡面還有資料
                                while((len=in.read(buffer))>0){
                                    //使用FileOutputStream輸出流將緩衝區的資料寫入到指定的目錄(savePath + "\\" + filename)當中
                                    out.write(buffer, 0, len);
                                }
                                //關閉輸入流
                                in.close();
                                //關閉輸出流
                                out.close();
                                //刪除處理檔案上傳時生成的臨時檔案
                              item.delete();
                                message = "檔案上傳成功!";
                            }
                        }
                    }catch (FileUploadBase.FileSizeLimitExceededException e) {
                        e.printStackTrace();
                        request.setAttribute("message", "單個檔案超出最大值!!!");
                        request.getRequestDispatcher("/message.jsp").forward(request, response);
                        return;
                    }catch (FileUploadBase.SizeLimitExceededException e) {
                        e.printStackTrace();
                        request.setAttribute("message", "上傳檔案的總的大小超出限制的最大值!!!");
                        request.getRequestDispatcher("/message.jsp").forward(request, response);
                        return;
                    }catch (Exception e) {
                        message= "檔案上傳失敗!";
                        e.printStackTrace();
                    }
                    request.setAttribute("message",message);
                   // request.getRequestDispatcher("/message.jsp").forward(request, response);
        }
        
        /**
        * @Method: makeFileName
        * @Description: 生成上傳檔案的檔名,檔名以:uuid+"_"+檔案的原始名稱
        * @Anthor:孤傲蒼狼
        * @param filename 檔案的原始名稱
        * @return uuid+"_"+檔案的原始名稱
        */ 
        private String makeFileName(String filename){  //2.jpg
            //為防止檔案覆蓋的現象發生,要為上傳檔案產生一個唯一的檔名
            return UUID.randomUUID().toString() + "_" + filename;
        }
        
        /**
         * 為防止一個目錄下面出現太多檔案,要使用hash演算法打散儲存
        * @Method: makePath
        * @Description: 
        * @Anthor:孤傲蒼狼
        *
        * @param filename 檔名,要根據檔名生成儲存目錄
        * @param savePath 檔案儲存路徑
        * @return 新的儲存目錄
        */ 
        private String makePath(String filename,String savePath){
            //得到檔名的hashCode的值,得到的就是filename這個字串物件在記憶體中的地址
            int hashcode = filename.hashCode();
            int dir1 = hashcode&0xf;  //0--15
            int dir2 = (hashcode&0xf0)>>4;  //0-15
            //構造新的儲存目錄
            String dir = savePath + "\\" + dir1 + "\\" + dir2;  //upload\2\3  upload\3\5
            //File既可以代表檔案也可以代表目錄
            File file = new File(dir);
            //如果目錄不存在
            if(!file.exists()){
                //建立目錄
                file.mkdirs();
            }
            return dir;
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {

            doGet(request, response);
        }
}

相關推薦

java後臺接受app圖片

package com.sujinabo.file; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream;

app圖片後臺Java

最近需要給APP提供介面,其中有上傳照片的,於是寫了下面這個介面。 支援上傳多個檔案,包括但不限於圖片。程式碼較簡單,就不多作解釋。 提一個點:由於是檔案上傳,因此不能把資料格式設定為"application/json;charset=UTF-8",會導致介面調不通,注意

Java筆記】TCP圖片案例分析

要求:從客戶端上傳一張圖片到伺服器,伺服器將圖片儲存在指定資料夾中,伺服器反饋上傳成功。 (本質是檔案複製,只要有資料來源和資料目的即可) 客戶端:資料來源是電腦某碟符下的某張照片               資料目的

小蜂窩徹底解決ewebeditor網站後臺不能圖片的方法

經我們技術員檢查,結果原來是eWebEditor文字編輯器對IE8瀏覽器的相容性導致的指令碼錯誤,並不是什麼“網站空間、伺服器中毒、出問題了”呢! 現就將解決方法公佈給大家,方便大家修正自己網站的程式碼以使文字編輯器在各種瀏覽器下都能相容、正常使用! 解決IE8

java form表單圖片

主要通過java後臺直接向微信伺服器上傳本地圖片,直接上程式碼: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.I

通過java呼叫Http介面圖片到伺服器

/** * 測試上傳png圖片 * */ public static void testUploadImage(){ String url = "http://localhost:8080/app/remindDetails/doRepair.xht

Java 後臺模擬POST

package org.lives.platform.upload.utils; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.Fi

PHP出了APP圖片base64

移動端為什麼使用base64上傳圖片 base64相對於form-data安全性高 ajax傳輸圖片資源會有失敗可能性,而base64不需要考慮這個。 因為移動端base64比form-data相容性更好 實現程式碼 header('Content-type:

java接受安卓及ios App圖片,並保存到阿裏OSS

access servle 設置 string gets ont 圖片上傳 擴展名 summary 做後臺的時候,寫了兩個方法,分別用來獲取安卓和蘋果IOS端上傳的頭像,保存到阿裏雲OSS圖片存儲服務器上。(SMM框架) 安卓及H5版本: 1 /** 2

.NET MVC 後臺接受base64的圖片

後綴 cep 設置 private sub turn orm 圖片格式 bsp 1 #region 配合前端的多張圖片上傳 2 #region 上傳圖片方法 3 /// <summary> 4

蘋果手機(ios)拍照圖片旋轉90度問題---java後臺處理

需要先匯入包 metadata-extractor-2.3.1.jar 地址 https://github.com/drewnoakes/metadata-extractor/releases?after=2.7.0 xmpcore-5.1.2.jar 依賴包 maven下載 med

java後臺解決圖片翻轉90的問題,有demo,經過測試可用

1.需要加入 依賴 metadata-extractor.jar 依賴如下 <dependencies> <!-- Extracts Exif, IPTC, XMP, ICC and other metadata from image and video file

Android圖片到伺服器並顯示(後臺Java處理)

Android上傳圖片(Android Studio) Fragment介面: private String img_src; /** * 從相簿選取圖片 */ public void selectImg() { Intent intent = new

web uploader 框架圖片java後臺處理

前言:最近剛剛接觸到微信端的開發,使用到了web uploader 框架作為上傳元件,初步接觸,走進了很多坑,在不斷的試驗,查文件基礎上終於解決了這個問題。再次記錄,希望能夠使其他使用此框架上傳圖片的初學者少走彎路。 目錄: 1.web uploader前臺

微信小程式圖片 後臺Java+spring接收

最近在做微信小程式圖片上傳,將程式碼上傳,造福後來人,廢話不多說,貼程式碼:微信小程式端 chooseImage(){ wx.chooseImage({ success: function (res) { var tempFilePath

Java前端圖片後臺

使用通用的SSM框架,maven構建; 簡單記錄一下前端檔案上傳到後臺的過程,免得到處找; spring-mvc.xml加入配置,這裡還可以加入檔案的編碼格式defaultEncoding屬性配置; <bean id="multipartResolver" cl

PHP.25-TP框架商城應用實例-後臺1-添加商品功能、鉤子函數、在線編輯器、過濾XSS、圖片並生成縮略圖

引用傳遞 none move 名稱 textarea 如果 library time fields 添加商品功能   1、創建商品控制器【C】  /www.test.com/shop/Admin/Controller/GoodsController.class.php

java模擬from表單提交,圖片

根據 lin style ont ack timeout nds readline return /** * java上傳表單,有圖片 * @param urlStr 上傳地址 * @param textMap 表單參數

java 圖片-簡單快速

     /*      * 採用file.Transto 來儲存上傳的檔案      */     @Request

fckeditor2.6.6 java圖片到絕對路徑的配置

改絕對路徑不需要修改原始碼。增加一些簡單的配置就可以了。可以回顯。另外要設定tomcat的server.xml,加一個硬碟對映。 fckeditor 2.6.6 我的是maven工程。 1:拷貝fckeditor資料夾到webapp/js下面 2:修改fckeditor/fckedi