所需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包