JSP上傳dicom檔案,Java解析dicom格式檔案
阿新 • • 發佈:2021-01-07
技術標籤:java解析dicom檔案jspjavadicom
所需jar包
commons-fileupload-1.4.jar
dcm4che-core-5.22.6.jar
commons-io-2.8.0.jar
commons-logging-1.2.jar
log4j-1.2.17.jar
slf4j-api-1.7.3.jar
slf4j-simple-1.7.3.jar
jsp頁面
<form action="UploadServlet" method="post" enctype="multipart/form-data"> <label>上傳檔案:</label><input type="file" name="spicture"> <input type="submit" value="上傳" style="background:url(../images/btnbg.png) no-repeat;width:70px;color:white;height:30px"> </form>
後端程式碼
我研究了半天,後端獲取前端穿過來的檔案用的是
InputStream fileSourceStream = request.getInputStream();
而我們需要用DicomInputStream來解析dicom檔案。這兩個輸入流不能相互轉換。所以我只能先獲取到輸入流,然後把上傳的檔案儲存到固定的地址。再重新用DicomInputStream dcmDicomInputStream = new DicomInputStream(file);這句話來獲取到輸入流。
整體程式碼如下:
package servlet.Patient; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; 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.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.dcm4che3.data.Attributes; import org.dcm4che3.data.Tag; import org.dcm4che3.io.DicomInputStream; import allbean.PatientBean; // 我的實體類 public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; private boolean isMultipart; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 預防亂碼 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8"); isMultipart = ServletFileUpload.isMultipartContent(request); String result = ""; response.setContentType("text/html;charset=utf-8"); if (!isMultipart) { result = "未獲取到檔案"; response.getWriter().println(result); return; } //先把檔案儲存到指定碟符 DiskFileItemFactory factory = new DiskFileItemFactory(); String path = getServletContext().getRealPath("/"); factory.setRepository(new File(path)); // 建立一個新的檔案上傳處理程式 ServletFileUpload upload = new ServletFileUpload(factory); try { List fileItems = upload.parseRequest(request); Iterator i = fileItems.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); if (!fi.isFormField()) { // 獲取上傳檔案的引數 String fieldName = fi.getFieldName(); String fileName = fi.getName(); String contentType = fi.getContentType(); boolean isInMemory = fi.isInMemory(); long sizeInBytes = fi.getSize(); path = path+System.currentTimeMillis() / 1000; // 寫入檔案 File file = new File(path+".dcm"); fi.write(file); } } result = "上傳成功"; } catch (FileUploadException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // InputStream fileSourceStream = request.getInputStream(); // 用DicomInputStream來獲取檔案 DicomInputStream dcmDicomInputStream=null; File file = new File(path+".dcm"); try { dcmDicomInputStream = new DicomInputStream(file); @SuppressWarnings("static-access") Attributes dataset = dcmDicomInputStream.readDataset(-1, -1); //輸出所有屬性資訊 System.out.println("所有資訊: " + dataset); //獲取行 int row = dataset.getInt(Tag.Rows, 1); //獲取列 int columns = dataset.getInt(Tag.Columns, 1); System.out.println("" + "row=" + row + ",columns=" + row + ",row*columns = " + row * columns); String patientName = dataset.getString(Tag.PatientName, ""); String patient_age = dataset.getString(Tag.PatientAge, ""); String patient_sex = dataset.getString(Tag.PatientSex, ""); String patientBirthDate = dataset.getString(Tag.PatientBirthDate, ""); //機構 String institution = dataset.getString(Tag.InstitutionName, ""); //站點 String station = dataset.getString(Tag.StationName, ""); String description = dataset.getString(Tag.StudyDescription, ""); //描述--具體 String SeriesDescription = dataset.getString(Tag.SeriesDescription, ""); //描述時間 String studyData1 = dataset.getString(Tag.StudyDate, ""); Date format1 = null; format1 = new SimpleDateFormat("yyyyMMdd").parse(studyData1); String studyData = new SimpleDateFormat("yyyy-MM-dd").format(format1); byte[] bytename = dataset.getBytes(Tag.PatientName); System.out.println("姓名: " + new String(bytename,"gb18030")); // Attributes dataset = dcmDicomInputStream.readDataset(-1, Tag.PixelData); request.setAttribute("patient_name", patientName); request.setAttribute("patient_age", patient_age); request.setAttribute("patient_sex", patient_sex); request.setAttribute("patient_birth", patientBirthDate); request.setAttribute("institution", institution); request.setAttribute("station", station); request.setAttribute("description", description); request.setAttribute("SeriesDescription", SeriesDescription); request.setAttribute("study_date", studyData); RequestDispatcher dispacher = request.getRequestDispatcher("addPatient.jsp"); dispacher.forward(request, response); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
我這個程式實現的是前端JSP上傳dicom檔案,後端獲取到上傳檔案後解析獲得病人的個人資訊。再把病人資訊回顯到前端jsp頁面上。
前面所需的jar包我打包放在了csdn上,有需要可以去下載。網址:
https://download.csdn.net/download/weixin_44439539/14020246
或者直接點選下方連結跳轉
上傳檔案和解析dicom檔案所需的jar包