更新時間:2022-07-12 11:30:34 來源:動力節點 瀏覽2347次
在設計豐富多彩的網站或業務邏輯豐富的程序的過程中,必然會有很多圖片的相關操作,尤其是圖片的上傳。紙質辦公室可能需要備份和上傳紙質文件,網站建設可能需要上傳用戶頭像、圖片描述等,都需要將圖片從本地上傳到互聯網(服務器)。
當業務需要時,機器會隨著不斷制作的照片上傳到網站上,以便在網站上查看。
由于圖片的處理比較新,我們打算一點一點的解決這些業務需求。一、業務分為以下幾個部分:
1.服務器接收瀏覽器上傳的圖片。這很容易實現,因為大部分服務器端開發都是基于B/S架構,即邏輯和瀏覽器端開發。
2.服務器接收客戶端上傳的圖片。這看起來可能不難,但是如何正確發送數據就有點難了,這也是今天筆者踩坑的地方。
3.業務邏輯的優化和完善。
1.新建一個網頁
<! DOCTYPE html >
< html >
< head >
< meta charset ="UTF-8" >
< title >圖片上傳</ title >
</ head >
< body >
< formaction ="/plant / upload.action" enctype ="multipart/form-data"
方法="post" >
圖片:type ="file" name ="img" /> <br /> 11 < input type = "submit" value ="upload" /> 12 </ form > 13 </ body > 14 </ html >
2.對Controller層進行編碼
@Controller
public class UploadController {
@RequestMapping(value="/upload",method= RequestMethod.POST)
@ResponseBody
public String uploadImg(@RequestParam("img" ) MultipartFile img, HttpServletRequest request,HttpServletResponse response) {
字符串內容類型 = img.getContentType(); //獲取文件類型
System.out.println("文件類型為:" + contentType);
字符串 originalFilename = img.getOriginalFilename(); //獲取文件原名
//判斷文件是否為空
if (! img.isEmpty()) {
File targetImg = new File("F:/img" );
//判斷文件夾是否存在
if (! targetImg.exists()) {
targetImg.mkdirs(); //級聯創建文件夾
}
try {
//開始保存圖片
FileOutputStream outputStream = newFileOutputStream("F:/img/" + originalFilename);
輸出流.write(img.getBytes());
輸出流.flush();
輸出流.close();
} catch (IOException e) {
e.printStackTrace();
}
}
返回“成功” ;
}
}
3.spring和依賴修改
<!-- 文件上傳組件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}< /版本>
</依賴>
<!-- 支持文件上傳 -->
<bean id="multipartResolver" class ="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 請求編碼格式 -->
<屬性名="defaultEncoding" value="utf-8"></property>
<!-- 上傳文件大小(Company:byte) -->
<property name="maxUploadSize" value="50000000"></property>
<!-- 緩沖區大小(Company:KB) -->
<property name="maxInMemorySize" value="1024"></property>
</bean>
4.啟動項目,打開瀏覽器顯示對應圖片上傳網頁,選擇圖片,點擊上傳。如果不走出本地路徑,應該會看到剛剛上傳的圖片。
互聯網上有很多內容。本部分介紹使用 HttpURLConnection 進行上傳。第一種方法相對復雜。您需要手動封裝請求并傳播數十行代碼。二是如果項目比較復雜,使用Session或者Cookie,沒辦法~
基于以上原因,本文選擇使用HttpClient上傳本地圖片
1.引入相關依賴
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId> org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.3</version>
</dependency>
2.編寫客戶端程序
導入java.io.BufferedReader;
導入java.io.File;
導入java.io.IOException;
導入java.io.InputStream;
導入java.io.InputStreamReader;
導入java.util.Arrays;
導入o??rg.apache.commons.codec.binary.Base64;
導入o??rg.apache.commons.lang3.StringUtils;
導入org.apache.http.HttpEntity;
導入o??rg.apache.http.client.ClientProtocolException;
進口org.apache.http.client.methods.CloseableHttpResponse;
導入org.apache.http.client.methods.HttpPost;
導入o??rg.apache.http.entity.ContentType;
導入o??rg.apache.http.entity.mime.MultipartEntityBuilder;
導入o??rg.apache.http.entity.mime.content.ByteArrayBody;
導入o??rg.apache.http.entity.mime.content.FileBody;
導入o??rg.apache.http.entity.mime.content.StringBody;
導入o??rg.apache.http.impl.client.CloseableHttpClient;
導入o??rg.apache.http.impl.client.HttpClients;
進口org.apache.http.util.EntityUtils;
public class ClientUpload {
public static void main(String[] args) throws ClientProtocolException, IOException, InterruptedException {
String url = "http://localhost:8090/plant/upload.action" ;
// 字符串 basePath = "F:\\img\\";
字符串路徑 = "G:\\123.jpg" ;
上傳圖片(網址,“dfsdfsdfsdf” ,路徑);
}
公共 靜態String uploadImage(String path, String base64String, String imageFilePath) throws ClientProtocolException, IOException {
// 1. 創建上傳需要的元素類型
// 1.1 本地上傳圖片加載文件
File imageFile = new File(imageFilePath);
文件體圖像文件體 =新文件體(圖像文件);
// 1.2 加載過程base64編碼的圖片數據
// String imageBase64Data = base64String;
// ByteArrayBody byteArrayBody = null;
// if (StringUtils.isNotEmpty(imageBase64Data)) {
// byte[] byteImage = Base64.decodeBase64(imageBase64Data);
// byteArrayBody = new ByteArrayBody(byteImage, "image_name");
// }
// 1.3 上傳對象的加載字符串
StringBody name = new StringBody("admin" , ContentType.TEXT_PLAIN);
// 2. 將要上傳的所有元素打包到 HttpEntity 對象中
// HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("name", name).addPart("img", imageFileBody).addPart("file2", byteArrayBody).build();
HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("name", name).addPart("img" , imageFileBody).build();
// 3. 建立HttpPost 對象,包含信息傳輸post news
HttpPost httpPost = new HttpPost(path);
httpPost.setEntity(reqEntity);
// 4. 建立 HttpClient 對象,傳入 httpPost 執行發送網絡請求的動作
CloseableHttpClient httpClient =HttpClients.createDefault();
CloseableHttpResponse 響應 = httpClient.execute(httpPost);
// 5. 獲取返回的實體內容對象并解析內容
HttpEntity resultEntity = response.getEntity();
字符串響應消息 = "" ;
try {
if (resultEntity != null ) {
InputStream is = resultEntity.getContent();
BufferedReader br = new BufferedReader( new InputStreamReader(is));
字符串緩沖區某人 =新字符串緩沖區();
字符串行 = "" ;
while ((line = br.readLine()) != null ) {
sb.append(line);
}
響應消息 = sb.toString();
System.out.println("響應內容為:" + responseMessage);
}
EntityUtils.consume(resultEntity);
}最后{
如果(空!=響應){
響應。關閉();
}
}
返回響應消息;
}
}
3.到目前為止,如果沒有意外的話,應該可以在控制臺看到令人興奮的“SUCCESS”輸出
1.由于圖片是不斷生成的,所以需要不斷的上傳圖片,保證上傳的圖片不重復。
public static void main(String[] args) throws ClientProtocolException, IOException, InterruptedException {
String url = "http://localhost:8090/plant/upload.action" ;
字符串 basePath = "F:\\img\\" ;
// 字符串路徑 = "G:\\123.jpg";
// uploadImage(url, "dfsdfsdfsdf",path);
while ( true ) {
File file = new File(basePath);
字符串[] 列表 =文件列表();
Arrays.sort(list);
for (String str : list) {
//圖片未標記為上傳
if (!str.startsWith("Upload" )) {
uploadImage(url, "chao", basePath + str); //上傳圖片
new File(basePath + str).renameTo( new File(basePath + "Upload_" + str)); //重命名圖片
}
}
Thread.sleep(1000*60); //等待 60 秒。
}
}
2.服務器的改進
如果想在開發的網站上能夠瀏覽圖片,一般業務比較小,可以直接發到Tomcat服務器,然后記錄路徑寫入數據庫;如果業務比較大,可以在本地設置圖片服務器,可以通過Nginx或者其他技術實現,然后需要將路徑寫入數據庫保存。
以上就是關于“Java上傳圖片到服務器的方法”介紹,大家如果想了解更多相關知識,不妨來關注一下動力節點的Java在線學習,里面的課程內容從入門到精通,很適合沒有基礎的小伙伴學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習