Contoh artikel ini menjelaskan cara mengimplementasikan fungsi unggah dan unduh file di struts2 di java. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
1.Unggah file
Yang pertama adalah kode halaman jsp
Tentukan tag unggahan di halaman jsp
Copy kode kodenya sebagai berikut:<tr>
<td align="right" bgcolor="#F5F8F9"><b>Lampiran:</b></td>
<td bgcolor="#FFFFFF">
<input type="file" nama="unggah" />
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
Kemudian atribut terkait yang ditentukan dalam BaseAction dihilangkan (Anda juga dapat mendefinisikannya dalam Action Anda sendiri, cukup ubah pengubah aksesnya)
Copy kode kodenya seperti berikut:/**
*Kelas dasar aksi
**/
kelas publik BaseAction memperluas ActionSupport {
unggahan Daftar<File> yang dilindungi;
Daftar dilindungi<String> uploadContentType; //Jenis file
Daftar dilindungi<String> uploadFileName; //Nama file
String yang dilindungi savePath; //simpan jalur
}
Lalu ada metode upload di Action, kodenya seperti berikut:
Copy kode kodenya seperti berikut:/**
* 8. Unggah lampiran * @param unggah
*/
public void uploadAccess(Daftar<File> unggahan){
mencoba {
if (null != unggah) {
for (int i = 0; i < unggah.ukuran(); i++) {
Jalur string = getSavePath() + ""+ getUploadFileName().get(i);
Sistem.keluar.println(jalur);
item.setAccessory(getUploadFileName().get(i));
FileOutputStream fos = FileOutputStream baru(jalur);
FileInputStream fis = FileInputStream baru(getUpload().get(i));
byte[] penyangga = byte baru[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
}
}
} tangkapan (Pengecualian e) {
logger.error("Kesalahan mengunggah lampiran.", e);
}
}
Maka kode copy file struts2.xml saya adalah sebagai berikut: <action name="itemRDAction_*" method="{1}">
<param name="savePath">e:unggah</param>
<interceptor-ref nama = "defaultStack">
<nama param="fileUpload.allowedTypes">
application/octet-stream,image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd. ms-excel
</param>
<param name="fileUpload.maximumSize">8000000</param>
</interseptor-ref>
<nama hasil="show_item_rd_upd"> /WEB-INF/jsp/page_item/updItem_rd.jsp</result>
<nama hasil="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
<nama hasil="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</aksi>
savePath adalah jalur penyimpanan, fileUpload.allowedTypes digunakan untuk membatasi jenis file unggahan fileUpload.maximumSize batas ukuran file
2. Pengunduhan file
Copy terlebih dahulu kode link download pada halaman tersebut sebagai berikut: <tr>
<td align="right" bgcolor="#F5F8F9"><b>Lampiran:</b></td>
<td bgcolor="#FFFFFF">
<div>${item.aksesori</div>
<c:if test="${!item kosong.aksesori}">
<div style="float: left;"><a style="color: black; text-decoration: none;" href="download.action?filename=${item.accessory}">Unduh</a>< /div>
</c:jika>
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
Berikutnya adalah kode untuk DownloadAction:
Copy kode kodenya seperti berikut:/**
* UnduhAksi
*
* @penulis zhaoxz
*
*/
@Controller("unduhAksi")
@Cakupan("prototipe")
kelas publik DownloadAction memperluas BaseAction {
/**
*
*/
serialVersionUID panjang akhir statis pribadi = -4278687717124480968L;
logger Logger statis pribadi = Logger.getLogger(DownloadAction.class);
nama file String pribadi;
aliran masukan pribadi aliran masukan;
penyimpanan String pribadi;
Tipe mime String pribadi;
Aliran Masukan publik getInputStream() {
mencoba {
Jalur string = getSavePath() + "//"+ String baru(namafile.getBytes("ISO8859-1"), "utf-8");
Sistem.keluar.println(jalur);
mimeType = ServletActionContext.getServletContext().getMimeType(path)+ ";charset=UTF-8";
inputStream = FileInputStream baru(jalur);
String agen = request.getHeader("USER-AGENT");
System.out.println(agen);
if (null != agen) {
if (-1 != agent.indexOf("Firefox")) {// Firefox
mimeType = mimeType.replace("UTF-8", "ISO8859-1");
} lain {// IE7+ Chrome
System.out.println("IE,Chrome");
nama file = String baru(nama file.getBytes("ISO8859-1"),,"utf-8");
nama file = java.net.URLEncoder.encode(nama file, "UTF-8");
}
}
} tangkapan (Pengecualian e) {
logger.error("Kesalahan mengunduh informasi file.", e);
}
jika (null == inputStream) {
System.out.println("kesalahan getResource");
}
kembalikan inputStream;
}
kekosongan publik setInputStream(InputStream inputStream) {
ini.inputStream = inputStream;
}
@Mengesampingkan
public String mengeksekusi() melempar Pengecualian {
kembali SUKSES;
}
/****************************** bersiaplah ***************** ******* **********/
String publik getSavePath() {
kembalikan ini.savePath;
}
public void setSavePath(String simpanPath) {
ini.savePath = simpanPath;
}
String publik getFilename() {
kembalikan nama file;
}
public void setFilename(String nama file) {
this.nama file = nama file;
}
}
Lalu ada file struts2.xml-nya:
Salin kode sebagai berikut: <nama tindakan="unduh">
<param name="savePath">E:/unggah</param>
<tipe hasil="aliran">
<param name="contentType">${mimeType}</param>
<param name="contentDisposition">lampiran;filename="${filename}"</param>
<param name="inputName">inputStream</param>
</hasil>
</aksi>
Saat mengunduh, perhatikan format pengkodean dan seharusnya tidak ada masalah.
Masalah yang ditemui saat mengunggah
1. Terjadi error saat mengupload file berukuran besar Solusi 1
Kesalahan yang terjadi adalah sebagai berikut:
1. 24-02-2012 11:06:31,937 ERROR (org.apache.struts2.dispatcher.Dispatcher:512) - Tidak dapat menemukan tindakan atau hasil
Tidak ada hasil yang ditentukan untuk tindakan com.iman.portal.action.QuestionActionImpl dan result problemPage - action - file:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51: 55
2. permintaan ditolak karena ukurannya (2973652) melebihi maksimum yang dikonfigurasi (2097152)
Arti Cina: Permintaan ditolak karena ukurannya (2973652) melebihi maksimum yang dikonfigurasi (2097152),
Mengingat pengalaman pengguna, pengecualian tersebut perlu dicegat saat mengunggah lampiran. Solusinya adalah sebagai berikut:
1. File yang diunggah pertama kali disimpan dalam cache selama proses pengunggahan. Demi alasan keamanan, tambahkan jalur penyimpanan sementara ke file struts.properties proyek, meskipun jalur fisik server telah ditetapkan dalam proyek.
Salin kode sebagai berikut: struts.multipart.saveDir=/temp
2. Mengingat ukuran file yang diunggah nanti dapat diubah, terlepas dari apakah itu default atau tidak, tambahkan konfigurasi berikut ke file struts.properties proyek:
Copy kode sebagai berikut: <!-- Ukuran file upload yang diperbolehkan adalah 2M -->
<nama konstan="struts.multipart.maxSize" value="2097152"/>
3. konfigurasi struts.xml
Salin kode seperti berikut: <!-- Cara memodifikasi soal -->
<nama tindakan="updateProblem" metode="updateProblem">
<interceptor-ref nama="fileUpload"/>
<interceptor-ref nama = "defaultStack" />
<result name="input">/page/question/page/problemPage.jsp</result>
</aksi>
4. Langkah paling penting dan kritis
Pencegat fileUpload hanya menentukan jenis dan ukuran file setelah file diunggah ke server. Jika kita tidak melakukan apa pun dalam Aksi, pengecualian akan ditampilkan di depan pengguna, jadi saya memikirkan cara untuk mengatur informasi pengecualian sebagai pesan kesalahan tingkat Aksi. Artinya, ganti metode addActionError.
Copy kode kodenya sebagai berikut: @Override
public void addActionError(String anErrorMessage) {
// Di sini kita perlu menentukan terlebih dahulu apakah kesalahan tersebut ingin kita ganti sebelum memprosesnya.
if (anErrorMessage.startsWith("permintaan ditolak karena ukurannya")) {
Pola pola = Pattern.compile("d+");
Pencocokan m = pattern.matcher(anErrorMessage);
// Cocokkan sekali
m.temukan();
String s1 =m.group();//Ukuran file yang diunggah
// Cocokkan lagi
m.temukan();
String s2 =m.group();//ukuran terbatas
if(!s1.equals("") && !s2.equals("")){
fileUploadErrorMessage="Ukuran berkas yang Anda unggah (" + Long.valueOf(s1)/1024 + "bytes) melebihi ukuran yang diperbolehkan (" + Long.valueOf(s2)/1024/1024 + "M)";
getRequest().setAttribute("fileUploadErrorMessage","File terlalu besar dan melebihi ukuran yang diizinkan ("+Long.valueOf(s2)/1024/1024+"M). Pengunggahan gagal!");
// Ganti informasinya
super.addActionError(fileUploadErrorMessage);
}
} else {// Jika tidak, tangani sesuai dengan metode aslinya
super.addActionError(anErrorMessage);
}
}
Ya, gunakan <s:fielderror/> <s:fielderror/> di halaman kembali untuk mendapatkan konten kesalahan di addActionError.
Karena saya tidak ingin menampilkan penyebab kesalahan pada halaman dan ingin memunculkan kotak prompt, saya memasukkan informasi tersebut ke dalam objek permintaan.
Saat halaman dimuat, verifikasi js berikut ditambahkan:
Copy kode kodenya sebagai berikut: // Tentukan apakah file berhasil diupload
var pesan="${request.fileUploadErrorMessage}";
if(pesan!=null && ""!=trim(pesan) && pesan!="null"){
self.parent.diag.close();
peringatan (pesan);
kembali;
}
Berikut beberapa referensi untuk memahami Dongdong:
struts.multipart.maxSize mengontrol ukuran maksimum file yang diunggah oleh keseluruhan proyek
Atribut maksimumSize dari pencegat struts.multipart.maxSize dan fileUpload memiliki pembagian kerja yang berbeda, yang dirangkum sebagai berikut:
1.struts.multipart.maxSize mengontrol ukuran maksimum file yang diunggah di keseluruhan proyek.
Jika ukuran ini terlampaui, kesalahan akan dilaporkan di latar belakang dan program tidak dapat menangani file sebesar itu. Akan ada prompt berikut di fielderror:
permintaan ditolak karena ukurannya (16272982) melebihi maksimum yang dikonfigurasi (9000000)
2. Atribut maksimumSize dari pencegat fileUpload harus lebih kecil dari nilai struts.multipart.maxSize.
Struts.multipart.maxSize default adalah 2M. Jika maksimumSize lebih besar dari 2M, nilai struts.multipart.maxSize harus ditetapkan lebih besar dari maksimumSize.
3. Jika file yang diunggah lebih besar dari struts.multipart.maxSize, sistem akan melaporkan kesalahan. Jika file yang diunggah berada di antara struts.multipart.maxSize dan maksimumSize, sistem akan meminta:
File terlalu besar: file "MSFconcept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
Bila file yang diunggah lebih kecil dari ukuran maksimum, maka unggahan berhasil.
Salin kode sebagai berikut: <action name="UploadFile">
<result name="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
<nama hasil="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref nama="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</interseptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</aksi>
Terjadi kesalahan saat mengunggah file besar Solusi 2:
Masalah: Kesalahan saat mengunggah file besar...
Solusi: Ubah parameter pada file struts.xml sebagai berikut. Copy kode sebagai berikut: <constant name="struts.multipart.maxSize" value="55000000"/>
<nama tindakan="UnggahFile">
<result name="UploadFileResult">/www.VeVB.COm/ ShowOtherFiles.jsp</result>
<nama hasil="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref nama="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</aksi>
Hubungan antara ukuran dalam file struts.xml dan ukuran file sebenarnya: 1048576 (Bytes) = 1024*1024 = 1M ukuran file sebenarnya.
struts.multipart.maxSize mengontrol ukuran maksimum file yang diunggah oleh keseluruhan proyek
Atribut maksimumSize dari pencegat struts.multipart.maxSize dan fileUpload memiliki pembagian kerja yang berbeda, yang dirangkum sebagai berikut:
1.struts.multipart.maxSize mengontrol ukuran maksimum file yang diunggah di keseluruhan proyek. Jika ukuran ini terlampaui, kesalahan akan dilaporkan di latar belakang dan program tidak dapat menangani file sebesar itu. Akan ada prompt berikut di fielderror:
permintaan ditolak karena ukurannya (16272982) melebihi maksimum yang dikonfigurasi (9000000)
2. Atribut maksimumSize dari pencegat fileUpload harus lebih kecil dari nilai struts.multipart.maxSize.
Struts.multipart.maxSize default adalah 2M. Jika maksimumSize lebih besar dari 2M, nilai struts.multipart.maxSize harus ditetapkan lebih besar dari maksimumSize.
3. Jika file yang diunggah lebih besar dari struts.multipart.maxSize, sistem akan melaporkan kesalahan. Jika file yang diunggah berada di antara struts.multipart.maxSize dan maksimumSize, sistem akan meminta:
File terlalu besar: file "MSFconcept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
Bila file yang diunggah lebih kecil dari ukuran maksimum, maka unggahan berhasil.
Batasan jenis file unggah
Konfigurasikan interseptor unggahan file
DefaultStack dari struts2 sudah berisi interseptor fileupload. Jika Anda ingin menambahkan parameterallowTypes, Anda perlu menulis defaultstack baru, menyalinnya dan memodifikasinya:
Salin kode sebagai berikut: <interceptors>
<nama tumpukan pencegat = "myDefaultStack">
<interceptor-ref nama="pengecualian"/>
<interceptor-ref nama="alias"/>
<interceptor-ref nama="servletConfig"/>
<nama ref pencegat="i18n"/>
<nama referensi pencegat=www.VeVB.COm/>
<nama ref pencegat = "rantai"/>
<interceptor-ref name="debugging"/>
<interceptor-ref nama="profiling"/>
<interceptor-ref nama="scopedModelDriven"/>
<interceptor-ref nama="modelDriven"/>
<interceptor-ref nama="fileUpload">
<param nama="allowedTypes">
gambar/png,gambar/gif,gambar/jpeg
</param>
</interseptor-ref>
<interceptor-ref nama="kotak centang"/>
<interceptor-ref nama="staticParams"/>
<interceptor-ref nama="actionMappingParams"/>
<interceptor-ref nama="params">
<param name="excludeParams">dojo..*,^struts..*</param>
</interceptor-ref>
<interceptor-ref nama="conversionError"/>
<interceptor-ref nama="validasi">
<param name="excludeMethods">masukkan, kembali, batalkan, jelajahi</param>
</interseptor-ref>
<interceptor-ref name="alur kerja">
<param name="excludeMethods">masukkan, kembalikan, batalkan, jelajahi</param>
</interseptor-ref>
</interceptor-stack>
</pencegat>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
Hanya ubah kode yang disalin dalam kode sebagai berikut: <interceptor-ref name="fileUpload">
<param nama="allowedTypes">
gambar/png,gambar/gif,gambar/jpeg
</param>
</interseptor-ref>
Tumpukan interseptor dikonfigurasikan di dalam tag <package> dan di luar tag <action> seperti di atas. Jika kita mendefinisikannya sebagai interseptor default, kita tidak perlu melakukannya
Perkenalkan di tag <action>. Jika tidak, Anda perlu memasukkan interseptor. Salin kodenya sebagai berikut: <action>
<nama hasil="input">/error/dbError.jsp</result>
<interceptor-ref name="myDefaultStack"></interceptor-ref>
</aksi>
Tindakan kesalahan jenis unggah file akan langsung mengembalikan masukan, jadi tidak perlu mengembalikan "input" dalam tindakan;
Anda juga dapat menentukan jalur dan ukuran permintaan unggahan Anda di luar tag <package>:
Salin kode sebagai berikut: <constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<nama konstan="struts.multipart.maxSize" value="1024"></constant>
Poin terpenting: formulir untuk mengunggah file harus menambahkan: enctype="multipart/form-data". Jika tidak, kesalahan input akan dilaporkan.
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.